目录
B+树(mysql默认索引采用B+树) 解决范围查询问题、减少IO查询的操作
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存放的是行数据。 -- 写入慢,查询快