为什么选用B+树这个数据结构
MySQL索引的数据结构其实并非是定式,主要取决于mysql使用的是哪个存储引擎.
而mysql支持多种存储引擎,其中Innodb是当下最主流的一种方式,Innodb中的数据结构是B+树.
想要了解Innodb存储引擎的小伙伴,可以自行去了解一下,这里不11讲解了.
我们不要忘记索引的目的是什么?
快速查找,我们应该选取最快的查找数据的数据结构.
我们先来看看学过的一些数据结构,比如说
哈希表:
非常优秀的数据结构,在查询,插入,删除,修改数据时有着O(1)的时间复杂度,但它还是不适合数据库的查询场景.
哈希表需要把给定的key通过hash函数映射出一个具体的下表,才能定位到具体的位置.
不要忘了,mysql有着模糊查询和范围查询的,哈希表就被抛弃了.
红黑树:
在插入,删除,修改,查询时的时间复杂度是O(logn).
红黑树中的数据是有序的,可以进行范围查询.也可以进行模糊匹配.
但是,红黑树最大的问题在于,当元素数量比较多时,树的高度会非常高.
高度越高,比较的次数就越多,因为索引这样的数据结构是存储在硬盘上的,意味着硬盘的IO操作也会非常多,所以,我们也抛弃了红黑树.
B树
我们先来看看B树长什么样子吧.
我们可以看到,此时每个节点都可以保存多个数据了,当总元素个数固定时,相比于二叉搜索树,树的高度大大降低了,随之带来的,硬盘IO开销也减少了.
因为B树中每个节点都存储了各自的元素,节点占据的空间就会比较大,没办法在内存中进行缓存了.
你们有没有这样一个疑问?
一个节点上有多个key相比于一个节点上有一个key,对于硬盘的开销会增大很多吗?
其实不会的,就只是多访问了一个数据而已,不会增大很多开销.
B+树
在B树的基础上,又做出了一些改进,形成了B+树.
对于B+树,总结出三个特点:
- B+树也是N叉搜索树,N个key就有N个区间,节点的最后一个key就是最大值或最小值了.
- 父节点的key会在子节点中以最大值的身份重复出现,叶子节点包含了整个数据全集.
- 其中,叶子结点按照链表的身份,首尾相连,便于"范围查询".
相对的,对于B+树.也产生了很多优势,我总结了三点:
- 比较擅长范围查询.
- 所有的查询操作,最后都会在叶子节点上,比较时间均衡,查询时间稳定.(稳定有时比效率更加重要)
- 因为叶子节点是存储了数据全集,所以表中的每一行数据的其它列,都可以保存到叶子节点上,而非叶子结点,只存储构建索引的key就可以了(非叶子节点的存储空间可以在内存中缓存一份,可以减少硬盘IO的次数).
结语
家人们有问题可以在评论区提问哈,你们的支持是我最大的动力!