一、索引的概念
索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的作用
- 帮助MySQL高效获取数据的数据结构(
有序)。 - 提高数据检索效率,降低数据的IO成本(不需要全表扫描)。
- 通过索引对数据进行
排序,降低数据排序的成本,降低了CPU的消耗。
二、索引的底层数据结构
MySQL的InnoDB存储引擎采用的索引底层数据结构是B+树。
首先看一下二叉树和B树。
2.1 二叉树
因为二叉树不稳定,导致时间复杂度最好时是O(logN),最坏时是O(N),所以MySQL没有采用二叉树。
2.2 红黑树
红黑树是平衡的二叉树,每个节点只能有2个子节点。但是如果表中数据量很大,比如1千万,红黑树的高度就会很高,查找数据时需要遍历很多层,查找效率并不高。
2.3 B树
B-Tree,B树是一种多叉平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一棵最大度数(max-degree)为5(5阶)的B-Tree为例,那这个B树每个节点最多存储4个key。节点数据是按照左小右大的顺序按序排列的。B树可以很好的解决大数量时的层高过高的问题。
2.4 B+树
B+Tree是在B-Tree基础上的一个优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。非叶子节点只存储指针,主要起索引导航的作用,只有在叶子节点才存储数据。
B树与B+树的区别:
- B树中叶子节点和非叶子结点都会存放数据。
- 磁盘读写代价B+树更低。因为非叶子节点上不存储数据,只存储指针,所以存储压力低。遍历索引树查找某个数据时,因为非叶子节点上不存储数据,所以读写代价低。
- 查询效率B+树更稳定。因为数据都存储在叶子节点上,查询时都要从根节点开始,遍历到叶子节点,效率比较稳定。
B+树便于扫库和区间查询。因为叶子节点之间通过双向指针进行连接。如果要找到区间内的数据,只需要从根节点找到区间左数,然后通过子节点之间的指针就可以快速找到区间内的全部数据。