InnoDB索引的原理
在鹅厂后端开发一面,我遇到了如题这样一个比较宽泛的问题,当时可能只是背了相关概念,对于索引的了解不是很深刻。
最近,我花了很大的功夫去深入了解MySQL的索引。
下面是我的一些思考:
索引 其实 就是目录, 从大体上看,其实结构和 用户记录页(叶子节点的页)很相似:
- 对于聚簇索引来说,只是叶子节点存放的列包括主键和其他列,索引存放的是每个页中最小主键值和页号
- 对于非聚簇索引来说,叶子节点存放的是 索引列 和主键值(没有包含全部的行数据),索引存放的是上述聚簇索引存放的+ 索引列的值(保证在B+树的同一层内节点的目录项记录除页号这个字段以外是唯一的)
每个页对应一个目录项,每个目录项包括下边两个部分:
聚簇索引
- 页的用户记录中最小的主键值,我们用 key 来表示。
- 页号,我们用page_no 表示。
非聚簇索引
- 索引列的值
- 主键值
- 页号
之前我们说过索引的构造和用户记录页 很相似,那么InnoDB 怎么区分一条记录是普通的用户记录还是目录项记录呢?别忘了记录头信息里的record_type 属性,它的各个取值代表的意思如下:
- 0 :普通的用户记录
- 1 :目录项记录
- 2 :最小记录
- 3 :最大记录
索引之间 有类似于 用户记录页 的 双向链表结构。