每个 InnoDB 表都有一个称为聚集索引的特殊索引,用于存储行数据。通常,聚集索引与主键同义。为了从查询,插入和其他的数据库操作中获得最佳性能,了解 InnoDB 如何使用聚集索引来优化常见的查询和 DML 操作非常重要。
-
在表上定义主键时,InnoDB 将其用作聚集索引。应该为每个表定义一个主键,如果数据库表在逻辑唯一非空列或列集没有使用主键,请添加 auto-increment 列。auto-increment 列是唯一的,并在插入新行时自动添加。
-
如果不为表定义主键,InnoDB 将使用第一个唯一索引(所有键列定义为 NOT NULL)作为聚集索引。
-
如果表没有主键或合适的唯一索引,InnoDB 将在包含行 ID 的合成列上生成一个名为 GEN_CLUST_INDEX 的隐藏聚集索引。这些行按 InnoDB 分配的行 ID 排序。行 ID 是一个 6 字节的字段,随着新行的插入而单调增加。因此,按行 ID 排序的行实际上是按插入顺序排列的。
通过聚集索引访问行非常快,因为聚集索引搜索直接指向包含行数据的页面。如果表很大,聚集索引体系结构通常可以节省磁盘 IO 操作,因为索引记录会将行数据存储到不同的页面(page)。
聚集索引以外的索引称为辅助索引。在 InnoDB 中,辅助索引中的每条记录都包含该行的主键列,以及辅助索引指向的列。InnoDB 使用此主键值搜索聚集索引中的行。
如果主键较长,则辅助索引将占用更多空间,因此主键较短是有优势的。