每个InnoDB表都有一个特殊的索引,称为聚簇索引,在每行数据存储的位置上。 通常聚集索引与主键是一个意思。 为了在查询,插入和其他操作中获得最佳性能,您必须了解InnoDB如何使用聚簇索引来优化每个表的最常见查找和DML操作。
当你在你的表上定义PRIMARY KEY时,InnoDB将它用作聚簇索引。为您创建的每个表定义一个主键。如果没有逻辑唯一且非空的列或一组列,请添加一个新的自动增量列,其值将自动填入。
如果您没有为您的表定义PRIMARY KEY,MySQL会查找第一个UNIQUE索引,其中所有键列都不为NULL,InnoDB将其用作聚簇索引。
如果该表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列内部生成一个名为GEN_CLUST_INDEX的隐藏聚簇索引。这些行按照InnoDB分配给此表中的行的ID进行排序。行ID是一个6字节的字段,随着新行的插入而单调递增。因此,由行ID排序的行在物理上处于插入顺序。
通过聚集索引访问行很快,因为索引搜索直接导向包含所有行数据的页面。如果表很大,与使用与索引记录不同页面存储行数据的存储组织相比,聚簇索引体系结构通常会节省磁盘I / O操作。
聚集索引以外的所有索引都称为二级索引。在InnoDB中,二级索引中的每条记录都包含该行的主键列,以及为二级索引指定的列。 InnoDB使用此主键值搜索聚集索引中的行。
如果主键很长,二级索引使用更多空间,所以有一个短主键是有利的。
有关利用InnoDB集群索引和二级索引的指导原则,请参见第8.3节“优化和索引”。