14.6.2.1 聚集索引和二级索引

每个InnoDBtable 都有一个称为clustered index的特殊索引,其中存储了行数据。通常,聚集索引与primary key同义。为了从查询,插入和其他数据库操作中获得最佳性能,您必须了解InnoDB如何使用聚 Cluster 索引来优化每个 table 的最常见查找和 DML 操作。

  • 在 table 上定义PRIMARY KEY时,InnoDB会将其用作聚 Cluster 索引。为您创建的每个 table 定义一个主键。如果没有逻辑唯一且非空的列或列集,请添加一个新的auto-increment列,其值将自动填写。

  • 如果您没有为 table 定义PRIMARY KEY,则 MySQL 将找到第一个UNIQUE索引,其中所有键列均为NOT NULL,而InnoDB将其用作聚集索引。

  • 如果 table 没有PRIMARY KEY或合适的UNIQUE索引,则InnoDB在包含行 ID 值的合成列上内部生成名为GEN_CLUST_INDEX的隐藏聚集索引。这些行由InnoDB分配给该 table 中的行的 ID 排序。行 ID 是一个 6 字节的字段,随着插入新行而单调增加。因此,按行 ID 排序的行实际上在插入 Sequences 上。

聚集索引如何加快查询速度

通过聚集索引访问行是快速的,因为索引搜索直接导致包含所有行数据的页面。如果 table 很大,则与使用不同于索引记录的页面存储行数据的存储组织相比,聚集索引体系结构通常可以节省磁盘 I/O 操作。

二级索引如何与聚 Cluster 索引相关

除聚集索引以外的所有索引都称为secondary indexes。在InnoDB中,辅助索引中的每个记录都包含该行的主键列以及为该辅助索引指定的列。 InnoDB使用此主键值在聚集索引中搜索行。

如果主键较长,则辅助索引将使用更多空间,因此具有较短的主键是有利的。

有关利用InnoDB集群索引和二级索引的准则,请参阅第 8.3 节“优化和索引”