MySQL B+树索引 和 Redis 中跳表索引的区别

一、MySQL B+树索引 和 Redis 中跳表索引

MySQL 中常用的索引是 B+树索引,而 Redis 中,例如 zset 使用的的是跳表索引,两者有什么区别呢,MySQL 为什么不使用 跳表 呢?或者说 Redis 中为什么不使用 B+树 呢?

下面先分别了解下 B+树和跳表的工作原理。

二、B+树

B+树是 B树的变体,B+树对比 B树,将B树的一个节点同时存放主键和数据的形式,改为叶子节点和非叶子节点形式。其中非叶子节点不存储具体数据,只存放主键和指向下一级数据的指针。而叶子节点在最尾端,存放主键和指向数据行的地址。叶子节点和非叶子节点采用指针连接,提高区间访问的性能。结构如下:

在这里插入图片描述

MySql 每次从磁盘读取数据是以页的形式读取,默认一页的大小为16k。这里假设每个主键占用8个字节,指针占6个字节,那么mysql 一次从磁盘读取 16k 就可以拿到 1024*16/(8+6)= 1170 条数据,假设树的高度为两级,这两次磁盘 IO 操作就可以大概涵盖 1170*1170 =1368900 查不到一百多万条数据,由此可见 B+树 效率之高。

此外 B+ 树能保证如此高的查询性能,关键点还在于B+树结构的平衡,这样就需要在插入数据的时候额外计算和调整树的平衡操作,一定程度降低了写的性能,下面来看下写的过程。

比如,当一个树节点最多可以存放5个索引的时候,在写入前 5 个数据的时候都不会触发树的平衡:

在这里插入图片描述

但是写入第6个数据的时候,因为一个节点最大放5个索引,所以下一步需要平衡,只能拆成二级结构:

在这里插入图片描述
由于最大的节点中有三个索引,所以下面两次写入,都不会触发平衡:

在这里插入图片描述
再次写入的时候,就需要进行平衡了,但是最上层的节点只有一个索引,所以可以在第一层加一个索引,第二层分三个节点:

在这里插入图片描述
依次类推,可以极大的较少树的层级。

所以 B+ 树通过空间换时间的方式,使用不同的叶子结点构建索引层级,将查询的时间复杂度从全表检索的O(n) 优化为O(lg(n))

三、跳表

跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

在这里插入图片描述

例如上述结构,假如需要查询主键为 7 的数据,首先在第一层从左向右可以找出在 6 之后、11 之前,然后进到 6 的下一层,继续从左向右可以找出在 6 之后、8 之前,然后进到 6 的下一层,从左向右就可以找到 7 了。

整体有点类似二叉树,但最后一层是全部的数据,上层通过增加跳跃点的方式加速检索的过程,并且跳跃点采用随机概率的方式决定是否增加,如果是两层跳跃层的话,在第一层加索引的概率就是 50% 概率,到第二层就是 25% 的概率 ,这样如何数据量样本足够大的话,数据的分布可以基本达到二分的效果。

由于每次写入数据,都随机决定是否要在每层增加索引,所以写入效率非常高。

例如写入数据9,首先在最后一层新增数据:

在这里插入图片描述

四、总结

MySQL 是磁盘存储的数据库系统,其中性能瓶颈在于磁盘IO的性能,而 B+树,以叶子节点和非叶子节点存储多索引的方式极大降低树的层级,在磁盘访问时能够保持较好的局部性,也大大降低了磁盘的读取次数,可以有效提升读取的性能。而跳表由于其随机指针的特性,在磁盘访问时可能导致更多的随机IO操作,影响访问效率。跳表在存储空间利用率上也不占优势。跳表需要维护多级索引,可能会导致额外的空间消耗,尤其是在数据量较大时,这种空间开销会变得非常显著。因此对比下来, B+树更适合 MySQL

Redis 是基于内存的数据库,数据操作都在内存中进行,无需关注磁盘IO,所以即使层级增大也影响不大,但是 B+树写数据时需要进行树平衡操作,反而影响了写的性能。而且跳表相对于B+树来说实现更加简单,代码量更少,容易理解和维护。在内存数据库中,简单且高效的实现是非常重要的考虑因素。跳表在支持范围查询方面比较灵活,插入、删除和查找操作的时间复杂度都是O(log n),这使得跳表在处理范围查询时表现较好。因此对比下来 Reids 中跳表的效果更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474043.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据? 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云…

分布式之Skywalking

Skywalking skywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint …

力扣Lc19--- 268. 丢失的数字(java版)-2024年3月20日

1.题目描述 2.知识点 (1)比如数组里面有n个数,然后计算这n个数的总和(用等差求和数列计算),然后减去数组的和,用总和减去数组和即为所得 (2)加强型 for 循环(也称为 for-each 循环&…

[C语言]指针笔试题

题一、 //结构体的大小是20个字节 struct Test{int Num;char *pcName;short sDate;char cha[2];short sBa[4];}*p;//假设p 的值为0x100000。 如下表表达式的值分别为多少? //已知,结构体Test类型的变量大小是20个字节 int main(){printf("%p\n"…

【transformer模型】一篇文章讲透

目录 引言 一、引言 二、Transformer模型的基本结构 1 编码器(python代码片段) 2 解码器 三、自注意力机制的工作原理 四、Transformer模型的应用场景 1 机器翻译 2 文本摘要 3 情感分析 4 语音识别 五、Transformer模型的发展现状及未来趋势…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

Python利用pygame实现飞机大战游戏

文章目录: 一:运行效果 1.演示 2.思路和功能 二:代码 文件架构 Demo 必备知识:python图形化编程pygame游戏模块 一:运行效果 1.演示 效果图◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考&#x…

web集群-lvs-DR模式基本配置

目录 环境: 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境: master lvs 192.168.80.161 no…

YOLOv5改进系列:新的颈部Eff-QAFPN(Efficientrep)结构助力涨点

一、论文理论 本文提出一种硬件友好的卷积神经网络结构,该结构类似于repvgg。在衡量网络效率时,经常使用Flops或者参数量,这些衡量指标对于硬件计算能力和内存带宽不敏感。因此,如何设计一个神经网络架构,使其有效地利用硬件计算能力和内存带宽是至关重要的。 论文地址:E…

Docker如何端口映射?

Docker是一种流行的开源容器化平台,它允许开发者将应用程序和其依赖资源打包到一个称为容器的可移植单元中。Docker提供了强大的管理和部署工具,使得应用程序可以在不同的环境中运行,无需担心环境配置的问题。在使用Docker部署应用程序时&…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法:滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

7 配置模板虚拟机

使用远程连接工具finalShell连接虚拟机后,接下来我们使用yum命令完成一些基础软件包的安装,以及将咱们新建的用户赋予管理员权限,最后关闭防火墙和卸载自带的JDK。 1. 安装epel-release 我们将使用yum命令进行安装,首先测试是否与…

海外重要行业媒体:知名服务商IntoTheBlock现已集成波场TRON网络分析数据

近日,领先链上分析服务提供商 IntoTheBlock 宣布已将波场 TRON 网络集成至其市场情报套件。该合作引发多家海外加密媒体关注,Crypto Slate、Crypto Briefing等均对此进行了报道,称此次合作意义深远,能帮助数百万用户更深入地了解波场TRON生态系统。 报道表示,波场TRON网络规模大…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

[pytorch] detr源码浅析

[pytorch] detr源码浅析 1. backbone部分2. encoder部分3. decoder部分4. 输出预测 为之后SAM的代码分析做铺垫 1. backbone部分 detr.py中的DETR class class DETR(nn.Module):def __init__(self, backbone, transformer, num_classes, num_queries, aux_lossFalse):...def …

适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自:设计模式深度解析:适配器模式与桥接模式-灵活应对变…

C++命名规则

如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套统一、带层次结构、清晰明了的命名准则就是必不可少而且非常好用的工具。 活跃在生物学、化学、军队、监狱、黑社会、恐怖组织等各个领域内的大量有识先辈们都曾经无数次地以实际行动证明了以上公理的…

零拷贝原理+kafka中的零拷贝

零拷贝原理kafka中的零拷贝 kafka性能之零拷贝传统IO零拷贝mmp优化sendfile优化sendfile DMA scatter/gather优化Kafka是怎么使用零拷贝的 kafka性能之零拷贝 kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数 传统IO 传统的一次IO流程 rea…

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献,用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高,不少汽车巨头都已入局。但这项技术的难度不小,相信在未来几年里,无人驾驶汽车这项…