这里我们首先要介绍一下磁盘IO的概念
磁盘IO
数据的索引是存储在磁盘中的,当需要调用索引来查找数据的时候,我们需要将磁盘中的索引加载到内存中,然后供CPU进行操作,在内存中对数据的处理速度是远高于磁盘IO的速度的,所以速度损耗一般发生在磁盘的IO速度上
磁盘IO就是磁盘的输入输出,将磁盘内容加载到内存与将内存中的内容放入磁盘
mysql索引的数据结构,各自优劣
索引的数据结构和具体的存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,InnoDB存储索引默认实现为:B+索引。对于哈希索引来说,底层的数据结构就是Hash表,因此在绝大多数需求为单条记录的查询的时候,可以选择Hash索引,查询性能快,其他情况建议选择B+Tree索引
常见问题
A:因为数据库索引是建立在磁盘上的,当数据量比较大的时候,索引可能非常大,可能达到几个G,就导致无法一次性加载到内存中,采用树结构,树的每个节点都是一个磁盘页,当访问到该节点的时候,只需要将对应的磁盘页加载到内存中,不需要将全部内存加载到内存中,提高了内存的利用率
就是与业务场景有关,如果只选择一个数据,hash更快,但是数据库中经常会选择多条数据,这时候因为B+树索引有序,并且又有链表系总量,他的查询效率比hash就要快的多了
A:对于普通的二叉树,无法做到数据的有序性
对于二叉排序树来说,平均的时间复杂度在O(logn)到O(n)之间,因为最好情况下二叉排序树就是平衡二叉树,平均查找的时间复杂度就是O(logn),特殊情况下会导致二叉排序树退化成链表,导致搜索效率变低,成为O(n),对于其他情况下效率在两者之间
对于平衡二叉树来讲,从算法逻辑上说,查找速度和比较次数都是最小的,但是在索引层面,我们需要考虑到磁盘IO的问题。
每当遍历索引树的一个节点,就代表进行了一次磁盘IO,所以最坏情况下,索引树的高度就是磁盘进行IO的次数,所以为了减少磁盘的IO次数,减少时间损耗,我们需要将树建立的矮胖
1.IO次数更少
代表着数据量相同的情况下B+树比B-树的高度更加低,查询时的IO次数也会更少
2.查询性能更稳定
因为B-树每个节点都存储着数据,B+树只有叶子结点存储着数据,所以B-树的查询性能并不稳定(最好情况是只查跟节点,最坏情况是查到叶子结点),而B+树的每一次查找都是稳定的
3.范围查询更方便
因为B+树底层是链表结构,所以在连续查询时只需要顺着底部的链表进行查询就可以了,而B-树需要在叶子结点、中间节点上反复横跳
参考文章
因篇幅问题不能全部显示,请点此查看更多更全内容