15.6.2.1 聚集索引和二级索引

原文地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html

每一张InnoDB表都拥有一个特殊的称之为聚集索引(clustered index)的索引,每条记录的数据会存放在此索引上。通常,聚集索引就是主键。为了获得查询、插入和其他数据库操作的最高性能,你必须理解InnoDB是如何使用聚集索引来优化每一张表最常见的查找和DML操作。

  • 当你在你的表中定义了一个主键,InnoDB则会使用这个主键来作为聚集索引。创建每一张表时最好都定义一个主键。如果没有业务上的唯一且非null的一列或多列可用,则可以创建一个自增列,它的值会自动填充。

  • 如果一张表没有主键索引,MySQL会定位到一个没有null值的唯一索引,然后用它来作为聚集索引。

  • 如果一张表没有主键和合适的唯一索引,InnoDB内部会基于一个人为生成的包含行ID值的列来创建一个叫做GEN_CLUST_INDEX的聚集索引。在这样的表中,数据行会根据分配的行ID值来排序。行ID是一个6字节的随着数据插入而单调递增的值。因此,通过行ID来排序的话会和插入数据的物理顺序相同。

聚集索引是如何加速查询的

通过聚集索引访问一行数据是非常快速的,因为索引查询可以直接定位到存储了整行数据的页上。如果一张表数据量很大,聚集索引的结构相比数据和索引记录不在同一个页上的结构相比,能够节省一次磁盘IO操作。

二级索引如何和聚集索引关联

除了聚集索引之外的其他索引我们都认为它是二级索引(secondary indexes)。在InnoDB中,二级索引的每一条记录都存储了该行的主键和创建该索引的列。InnoDB使用主键值来查找该行数据。

如果主键长度很长,二级索引就会使用更多的存储空间,所以使用一个较短的主键是有优势的。

关于如何利用聚集索引和二级索引的优点,请查看第8.3节 索引优化