为什么 MySQL 使用 B+tree 作为 InnoDB 引擎的索引结构,而 redis 使用跳表作为ZSET的实现?

为什么Mysql 使用 B+树而不是红黑树(或其他)?

数据库的数据被分割为多个页以文件的形式存储在硬盘上的。因此我们每次进行数据库查询其实是在做磁盘IO,而磁盘IO是时间开销较大的操作!数据库在进行索引查找的时候每次访问一个页都是一次磁盘IO。因此我们需要选择一种能够尽量少做磁盘IO的数据结构来创建索引!

之所以选择B+树是因为它的扇出率较大,树高较小。因此在进行索引搜索的时候需要进行的IO数量也较其他树的数量小。

B+树只有叶子节点会存储数据,将B+树每一个叶子节点通过指针连接起来就能实现顺序遍历,而遍历数据在关系型数据库中非常常见,所以这么选择是完全没有问题的。

因此,在不同应用场景选树我们都会做如下思考:基于内存操作的我们考虑红黑树,AVL 和 BST,基于磁盘操作的我们优先考虑 B或者B+树。

MySQL默认的存储引擎选择B+树而不是B树的原因:B树能够在非叶子节点存储数据,但是这也导致在查询连续数据的时候可能带来更多的随机IO,而B+树的所有叶子节点可以通过指针相互连接,能够减少顺序遍历时产生的随机IO

为什么redis使用跳表?

跳表是一种采用用空间换取时间的数据结构。它会随机的将一些节点提升到更高的层次,以创建一种逐层的数据结构,以提高操作的速度。在理论上能够在Olog(n)时间内完场查找、插入、删除的操作。

跳表的性质:

1.由很多层结构组成,level是通过一定的概率随机产生的。

2.每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法。

3.最底层(level1)的链表包含所有元素。

4.如果一个元素出现在Leve i 的链表中,则它在Level i 之下的链表也都会出现。

5.每个节点包含两个指针。一个指向同一链表中的下一个元素,一个指向下面一层的元素。

redis使用跳表理由:

跳表比B或者B+树占用的内存更少

以链表的形式遍历跳跃表,跳跃表的缓存局部性与其他类型的平衡树相当

跳表更容易实现、调试等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值