Clustered Index(聚簇索引)是叶子记录直接包含完整业务行的索引;InnoDB 通常用主键组织它。Secondary Index(二级索引)是其他索引;叶子保存自己的索引列和主键值。
下面继续使用订单例子:tenant_id 表示商户编号,created_at 表示创建时间,amount 表示订单金额,note 表示订单备注。
| 索引 | 叶子记录 | 查询得到什么 |
|---|
| 主键对应的聚簇索引 | 主键 + 完整行 | 定位到叶子后已取得业务行 |
二级索引 (tenant_id,created_at) | 商户、时间 + 主键 id | 先得到 id;若还需其他列,再按 id 查聚簇索引 |
“从二级索引拿到主键,再去聚簇索引取得完整行”叫回表。它解释的是两棵树之间的数据路径,不等于一定发生两次磁盘读取:相关页可能已在缓冲池。
最应记住:二级索引叶子并不默认包含完整行;常见误读是把“使用二级索引”理解成“已经取到所有列”。
主键宽度会被放大:每个二级索引记录都携带主键。过长的主键会让所有二级索引一起变宽,使单页容纳更少记录。