MySQL 8.4 Release Notes
17.6.2.1 集群索引和次要索引
每个InnoDB
表都有一个特殊的索引称为集群索引,它存储行数据。通常,集群索引与主键相同。为了从查询、插入和其他数据库操作中获得最佳性能,需要了解InnoDB
如何使用集群索引来优化常见的查找和DML操作。
-
当你为表定义了一个
PRIMARY KEY
时,InnoDB
将其用作集群索引。每个表都应该定义主键。如果没有逻辑唯一且非空的列或一组列来使用主键,可以添加自增列。自增列值是唯一的,并在插入新行时自动增加。 -
如果你没有为表定义
PRIMARY KEY
,InnoDB
将使用第一个所有关键列都定义为NOT NULL
的唯一索引作为集群索引。 -
如果表没有主键或合适的唯一索引,
InnoDB
将生成一个隐藏的集群索引名为GEN_CLUST_INDEX
,在一个包含行ID值的synthetic列上。行是按行ID顺序排列的,该行ID是一个6字节的字段,它会单调增加随着插入新行。因此,按行ID顺序排列的行实际上是物理顺序的插入顺序。
通过聚簇索引访问行是非常快的,因为索引搜索直接将结果指向包含行数据的页面。如果表很大,聚簇索引架构通常可以在与存储组织不同页面存储行数据时节省一个磁盘I/O操作。
Secondary 索引如何相关到聚簇索引
除了聚簇索引外的索引称为secondary索引。在InnoDB
中,每个secondary索引记录都包含该行的主键列,以及指定的secondary索引列。InnoDB
使用这个主键值来在聚簇索引中搜索该行。
如果主键很长,secondary索引将占用更多空间,因此有一个短的主键是有利的。
要充分利用InnoDB
聚簇和secondary索引,请参阅第10.3节,“Optimization and Indexes”。