#### 15.6.2.1 聚集索引和二级索引

[](<>)[](<>)[](<>)[](<>)

每个`InnoDB`table 有一个特殊的索引，称为聚集索引，用于存储行数据。通常，聚集索引与主键同义。为了从查询、插入和其他数据库操作中获得最佳性能，了解如何`InnoDB`使用聚集索引来优化常见的查找和 DML 操作。

-   当你定义一个`首要的关键`在一张桌子上，`InnoDB`将其用作聚集索引。应该为每个表定义一个主键。如果没有逻辑唯一且非空的列或列集来使用主键，请添加一个自动增量列。自动增量列值是唯一的，并在插入新行时自动添加。

-   如果你没有定义一个`首要的关键`对于一张桌子，`InnoDB`使用第一个`独特`所有键列定义为的索引`非空`作为聚集索引。

-   如果一个表没有`首要的关键`或合适的`独特`指数，`InnoDB`生成一个名为`GEN_CLUST_INDEX`在包含行 ID 值的合成列上。行按行 ID 排序`InnoDB`分配。行 ID 是一个 6 字节的字段，随着新行的插入而单调增加。因此，按行 ID 排序的行在物理上是按插入顺序排列的。

##### 聚集索引如何加速查询

通过聚集索引访问行很快，因为索引搜索直接指向包含行数据的页面。如果表很大，与使用与索引记录不同的页面存储行数据的存储组织相比，聚集索引架构通常会节省磁盘 I/O 操作。

##### 二级索引与聚集索引的关系

聚集索引以外的索引称为二级索引。在`InnoDB`，二级索引中的每条记录都包含该行的主键列，以及为二级索引指定的列。`InnoDB`使用此主键值在聚集索引中搜索行。

如果主键长，二级索引占用的空间就更多，所以主键短是有利的。

获取指南以利用`InnoDB`聚集索引和二级索引，请参阅[第 8.3 节，“优化和索引”](optimization-indexes.html).
