mysql索引实现原理、及相关数据结构:二叉树>平衡二叉树>B树>B+树!

目录

MySQL中索引采用的是那些数据结构?

Hash索引 

平衡二叉树

平衡二叉树 查询原理:

如何去减少查询IO次数? - B树

B树

B+树(mysql默认索引采用B+树) 解决范围查询问题、减少IO查询的操作

Myisam和InnerDB中对B+树 索引的不同实现方式

Myisam索引实现原理

InnerDB索引实现原理

结论


MySQL中索引采用的是那些数据结构?

Hash索引、平衡二叉树、B树、B+树。

Hash索引 

优点:通过字段的值计算的hash值,定位数据非常快。 index=Hash(key)

缺点:不支持范围查询

为什么不支持范围查询?

因为底层数据结构是散列的,无法进行比较大小。

AVL平衡二叉树

https://blog.csdn.net/qq_36881887/article/details/110290283

平衡二叉树:会取一个中间值,中间值左边称为左子树(左指针) ,中间值右边称为右子树(右指针) 。

左子树比中间小,右子树比中间值。

平衡二叉树 查询原理:

磁盘IO性质:磁盘IO 到 内存:例如查询数据时不会将全部数据一次性读取到内存(防止内存溢出),而是先进行磁盘IO确定需要获取哪些具体数据,然后再读取需要的数据到内存中。

假设查询上述图中的10 (需要经历4次IO操作)

1次从硬盘中读取 4 到内存中,判断下10>4,取右指针

2次从硬盘中读取 8 到内存中,判断下10>8,取右指针

3次从硬盘中读取 9 到内存中,判断下10>,取右指针

4次从硬盘中读取 10 到内存中,判断下10=10,定位到数据

平衡二叉树:查询效率还可以,缺点:虽然支持范围查询,但是回旋查询效率低。

规律:如果树的高度越高,那么查询IO次数会越多。

回旋:如下图查询大于5的数据,需要回旋去获取右指针所有数据:

如何去减少查询IO次数? - B树

B树

B树在平衡二叉树中,减少树的高度,B树的节点支持多个元素,所以B树数据结构相比平衡二叉树数据结构实现减少磁盘IO的操作(B树是在平衡二叉树中进行改进的)   

从而提高查询效率;

缺点:范围查询效率还是比较低。

B+树(mysql默认索引采用B+树) 解决范围查询问题、减少IO查询的操作

B+树图中最下一行节点为叶子节点,其余为非叶子节点。

B+树相比B树,新增叶子节点非叶子节点关系,叶子节点中包含了key和value,非叶子节点中只是包含了key,不包含value

B+算法: 通过继承B树的特征,B+树相比B树,新增叶子节点与非叶子节点关系,叶子节点中包含了key和value(value中记录着数据存放的地址或是具体数据),非叶子节点中只是包含了key,不包含value。

查询方式:通过非叶子节点查询到叶子节点获取对应value,所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,不需要回旋,从而范围查询效率非常高

缺点因为冗余节点数据,比较占硬盘大小。

Myisam和InnerDB中对B+树 索引的不同实现方式

Myisam索引实现原理

Myisam索引结论:新增数据块,因为叶子节点中的value存放的是数据地址值,而非数据(减少了IO磁盘操作时间)。

InnerDB索引实现原理

结论

Mylsam和InnerDB都是采用B+树实现。

Mylsam中叶子节点的value存放的是数据的地址,再通过地址查询对应行数据。  -- 写入快,查询慢

InnerDB中叶子节点的value存放的是行数据。 -- 写入慢,查询快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祁_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值