mysql-基于tree的索引的数据结构

各种基于树的索引的数据结构:

1.普通二叉树:
查找的效率取决于数据的分布情况,如上图类似于全表扫描:
在这里插入图片描述
在这里插入图片描述
2.平衡二叉树(红黑树就是一颗定义更复杂一些的平衡二叉树):
会在数据的插入或删除的时候,通过一个平衡因子(旋转树的方式)去保证整个树的相对平衡
(1)相对平衡二叉树:某个节点的子节点的高度差不会超过1
在这里插入图片描述
(2)完全平衡二叉树:AVL树,整棵树的高度差都不会超过1

检索过程:一个节点就认为是在一个磁盘块的位置,一个节点包含了关键字(比如id),数据区(真正存储磁盘位置或内存地址的地方,通过这个地址的映射真正去表中加载数据的区域),子节点引用(有P1,P2两个指针地址),要加载的关键字和根节点的关键字进行比对,通过子节点引用快速进行顺序IO,指向左或右子节点,继续进行关键字的比对,直到命中关键字,然后加载数据区的数据。

缺点是:
(1)数据处的(高)深度决定着他的IO操作次数,IO操作耗时大
(2)每一个磁盘块(节点/页)保存的数据量太小了,没有很好的利用操作磁盘IO的数据交换特性(操作系统去硬盘中读取一次,交换的数据是4kb),也没有利用好磁盘IO的预读能力(空间局部性原理:操作系统在读取文件头的4k以后,它会认为接下来的8k,16k或更多的数据也需要读取),从而带来频繁的IO操作。
注意:MySQL一次性加载16k。一次性读操作系统的4页相当于读MySQL的1页。

3.多路平衡查找树,B-Tree是一颗绝对平衡树
在这里插入图片描述
特点:(1)所有子节点全部在同一层,新增一条数据时,节点的关键字个数超过路数时,由下向上分裂增加高度。
(2)每个节点的关键字的个数最多有(m路-1)个,MySQL路数=16k1024/索引字段的数据类型的字节长度。
(3)定义数据类型的长度时,能短则短,否则冗余的字节数会拖垮整个路数,使得IO开销增大,性能下降。
很多关系型数据库选择B树这种数据结构作为索引机制,因为他很好的利用了磁盘的交互特性,特别是硬盘级的索引,要么是B树,要么是B树的变种,比如MySQL用的B+树,Oracle用的B
树。

4.MySQL的B+树
在这里插入图片描述
是以左闭合区间的方式实现,推崇的是以数字作为索引,基本是自增,往右边插入数据。
数据全保存在叶子节点,子节点只保存关键字和引用。

B+tree与B-tree 的区别:
1,B+tree节点关键字搜索采用闭合区间,就算根节点命中了,最终也会找到叶子节点。
2,B+tree非叶子节点不保存数据相关信息,只保存关键字和子节点的引用
3,B+tree关键字对应的数据保存在叶子节点中
4,B+tree叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

MySQL索引选择B+tree的原因是:
(1)B+树是B树的变种(PLUS版)多路绝对平衡查找树,他拥有B树的优势
(2)B+树扫库、表能力更强
(3)B+树的磁盘读写能力更强
(4)B+树的排序能力更强
(5)B+树的查询效率更加稳定

上一篇:MySQL的几种存储引擎
下一篇:MySQL内部原理深度解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值