0%

Innodb索引深入研究

之前对索引这块有所了解,也按照一些索引优化实践对表进行过优化,但都是一知半解,不清楚为什么要这么做。本篇文章会对Innodb索引是怎么存储以及怎么使用的进行深入的研究,从而理解索引优化的原理,最后会对索引的使用进行总结。

索引存储结构

先来看下Innodb是如何存储数据。
主键索引

从上图可以看出,最下层存储的是相关的记录,上面一层存储的是目录项,其实就是主键索引。目录项存储格式和存储真实记录的格式一样,具体的行格式可以参考InnoDB行格式,只不过是存储的内容不一样,目录项存储的内容是主键值和其对应的页号。

通过目录项就可以根据主键id快速找到对应的记录,具体的查找过程如下

  1. 确定存储主键id对应的目录页
  2. 通过存储目录项记录的页确定用户记录真正所在的页
  3. 在真正存储用户记录的页中定位到具体的记录

另外在Innodb中,每个数据页的大小是16KB,上面存储目录的页和存储数据的页都叫做数据页,因此每页能存储的目录项是确定的,当超出大小时,就会产生一个新的目录页来存储对应的目录。最终会产生出下面这种样式的存储结构,类似于多级目录,大的目录页里嵌套小的目录页。存储数据的页当超出能存储的最大数据记录个数时,也会创建一个新的页面存储,但是只会在最下面一层。

上面描述的结构其实就是B+树。具体什么是B+树介绍的文章比较多,这里就不在具体阐述,只需要明白Innodb是如何存储数据的即可。

下面介绍几个概念

  1. 聚簇索引: 数据和索引存储在一块,上面描述的主键索引就是聚簇索引。
  2. 二级索引: 非主键索引以外的索引都可以叫做二级索引,这种索引和主键索引存储结构是一样,只是记录的数据有区别,在目录项中记录的是二级索引对应的列、主键以及页地址,数据记录中记录的是列值和主键值。因此当使用二级索引查找数据时,仅仅只是找到了对应的主键值,还需要根据主键值在主键索引中查找对应的数据,级回表操作。
  3. 联合索引: 多列组合在一起的索引,也属于二级索引,区别是存储多个列。

索引优缺点

索引的优点当然是能够加速查找,缺点有俩点,空间: 创建一个新的索引,就会将对应的结构存储到磁盘上,会增加存储的代价。时间: 虽然索引能够增加查询的速度,但是对于增删改操作时,不仅需要完成操作本身,还需要操作对应的索引,因此会增加相应的时间成本。

应用索引

参考

  1. Mysql是怎样运行的

Innodb 索引结构是怎样的
使用索引带来的问题