MySQL-索引底层数据结构

90 阅读2分钟

一、索引的概念

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

索引的作用

  • 帮助MySQL高效获取数据的数据结构(有序)。
  • 提高数据检索效率,降低数据的IO成本(不需要全表扫描)。
  • 通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

二、索引的底层数据结构

MySQL的InnoDB存储引擎采用的索引底层数据结构是B+树。

首先看一下二叉树和B树。

2.1 二叉树

因为二叉树不稳定,导致时间复杂度最好时是O(logN),最坏时是O(N),所以MySQL没有采用二叉树。

83ned4pYuu.jpg

2.2 红黑树

红黑树是平衡的二叉树,每个节点只能有2个子节点。但是如果表中数据量很大,比如1千万,红黑树的高度就会很高,查找数据时需要遍历很多层,查找效率并不高。

UDDNOgYJZL.jpg

2.3 B树

B-Tree,B树是一种多叉平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一棵最大度数(max-degree)为5(5阶)的B-Tree为例,那这个B树每个节点最多存储4个key。节点数据是按照左小右大的顺序按序排列的。B树可以很好的解决大数量时的层高过高的问题。

lz5iQenNS5.jpg

2.4 B+树

B+Tree是在B-Tree基础上的一个优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。非叶子节点只存储指针,主要起索引导航的作用,只有在叶子节点才存储数据。

1691153041070.jpg

B树与B+树的区别:

  • B树中叶子节点和非叶子结点都会存放数据。
  • 磁盘读写代价B+树更低。因为非叶子节点上不存储数据,只存储指针,所以存储压力低。遍历索引树查找某个数据时,因为非叶子节点上不存储数据,所以读写代价低。
  • 查询效率B+树更稳定。因为数据都存储在叶子节点上,查询时都要从根节点开始,遍历到叶子节点,效率比较稳定。
  • B+树便于扫库和区间查询。因为叶子节点之间通过双向指针进行连接。如果要找到区间内的数据,只需要从根节点找到区间左数,然后通过子节点之间的指针就可以快速找到区间内的全部数据。