目录

MySQL 的索引

MySQL 的默认引擎 InnoDB 使用 B+ 树索引。B+ 树是一种多路平衡查找树,它的每个节点最多包含 m 个子节点,m 被称为 B+ 树的阶。MySQL 的 B+ 树索引是在 B+ 树的基础上进行的优化,它的叶子节点存储了完整的数据记录,而不是像 B+ 树那样只存储键值。

主键索引/聚簇索引/聚集索引

/posts/2023/images/008-01.png

InnoDB 的表数据文件本身就是索引文件,表数据文件本身就是按 B+ 树组织的一个索引结构,这棵树的叶子节点 data 域保存了完整的数据记录,这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这样的索引方式的优点是查找速度非常快,因为可以根据主键值直接找到数据记录所在的页。如果表中的数据按照主键顺序插入,那么数据在物理上也是顺序存放的,这种存储方式也提高了数据的访问速度。

主键索引也被称为聚簇索引,因为数据行和主键索引存储在一起,而且一个表只能有一个主键索引。当在创建表时没有显式指定主键,InnoDB 会生成一个隐藏的主键,这个主键包含一个自增的整数列,这个列就是这个隐藏的主键索引。

_rowid 是 InnoDB 的一个隐藏的列,它是一个 6 字节的整数,如果表中没有定义主键,InnoDB 会隐式定义一个主键索引,这个索引包含一个自增的整数列,这个列就是这个隐藏的主键索引。

非主键索引/二级索引/辅助索引

/posts/2023/images/008-02.png

非主键索引的叶子节点不包含行的全部数据,而是包含主键的值。在 InnoDB 中,非主键索引的叶子节点 data 域存储的不是行的物理位置,而是主键的值。这样的索引叫做非聚簇索引,因为数据行的物理位置和主键索引分开了。非主键索引也被称为二级索引。

二级索引的叶子节点包含主键的值,而不是行的物理位置,所以在使用二级索引时,需要先根据二级索引找到主键值,然后再通过主键值找到完整的数据行。这个过程称为回表。过多的回表会降低查询效率,所以在使用二级索引时,应该尽量使用覆盖索引,即索引包含了查询所需要的全部数据,不需要回表。

联合索引/复合索引/组合索引

为了减少索引的数量,提高索引的效率,可以使用联合索引。联合索引是多个字段上创建的索引,只有在查询条件中使用了联合索引的第一个字段,索引才会被使用。使用联合索引时,要遵循最左前缀原则,即查询条件中使用了联合索引的第一个字段,索引才会被使用。

自适应哈希索引

自适应哈希索引是 InnoDB 引擎特有的一种索引,它是一种基于内存的索引,它的目的是提高单表的查询速度。自适应哈希索引是一种不稳定的索引,它是在内存中建立的,当表关闭时,自适应哈希索引就会丢失。自适应哈希索引的目的是提高单表的查询速度,它的原理是在 InnoDB 的缓冲池中维护一张哈希表,每当执行全表扫描时,InnoDB 会根据表的访问模式自动将热点数据存储到哈希表中,这样就可以提高单表的查询速度。

也就是说经常访问的数据会形成热点数据,InnoDB 会根据表的访问模式自动将热点数据存储到哈希索引,这样就可以提高单表的查询速度。

哈希索引的缺点是只能满足等值查询,不能使用范围查询,也不能用于排序和分组,因此哈希索引只能用于等值查询,不能用于范围查询。