前言
Mysql数据库的InnoDB存储引擎通过B+树索引和自适应Hash索引来完成对数据的查询检索,而为什么要选择B+树这种数据结构作为索引的实现,也是接下来要谈论的重点。
在Mysql数据库中,数据库中存储的数据和索引是在物理磁盘中存放的,也就是说每一次的数据检索都会造成一次或多次的磁盘IO,所以减少磁盘IO也是索引需要考虑的要点。
二叉查找树
二叉查找树是二叉树的一种,它每个根节点最多有两个子节点,通过中序遍历可以实现对二叉树进行有序查找。接下来我们考虑为什么没有使用二叉树作为索引数据结构。
- 因为二叉树的性质,如果数据库中数据量很大,会造成二叉树的高度增加,如果使用二叉查找树作为索引会导致查询数据时的多次磁盘IO,极大的降低了查询的性能。
- 二叉树并不维持自平衡,在极端情况下可能会退化为单链表的情况。
- 在数据库的应用中,有序查询或者范围查询的场景是十分普遍的,而二叉树对于范围查询的支持并不友好。
红黑树
- 虽然红黑树解决了极端情况下退化为链表的情况,但是数据量增大也会导致红黑树的树高增加,造成多次磁盘IO的情况。
- 红黑树因为需要维持自身的平衡(插入和删除都需要额外进行调整),所以需要额外的去处理红黑树自平衡的问题。
- 在数据库的应用中,有序查询或者范围查询的场景是十分普遍的,而红黑树对于范围查询的支持并不友好
跳跃表
跳跃表的数据结构是在redis的底层数据结构中有所体现,但是为什么没有在Mysql中进行使用呢。
- 跳跃表是通过空间换时间的方式进行实现的,他相比于红黑树,支持了范围查询,但是如果数据量过大是,会导致跳跃表中的层级过高,造成多次的磁盘IO。
B树
B树可以说是和B+树最为相似的数据结构。
- B树的每个节点既存储导航值也存储数据,导致检索数据时不能查询更多的索引,会造成更多的磁盘IO,空间利用率较B+树较差。
- B树对于范围查询支持一样不是很友好。
B+树
B+树是Mysql选择作为索引的数据结构,相比于其他数据结构,B+树具备以下优点。
- B+树的叶子节点存储数据,非叶子节点存储导航值,这样数据库将每个节点加载到内存中时可以查询更多的索引。
- B+树叶子节点存储数据,并且叶子节点之前增加了前后指针,实现了有序的双向链表数据结构,使得B+树对于范围查询的支持较好。