直接回答:聚簇索引指索引的叶子节点直接存放整行数据,数据物理上按索引键组织——InnoDB 中主键索引就是聚簇索引,表数据本身即这棵 B+ 树。非聚簇索引(二级索引)的叶子只存索引列加主键值,查完整行需拿主键再回聚簇索引找一次,即"回表"。
展开解析:关键推论:
- InnoDB 每张表必须有聚簇索引:优先用主键,否则选第一个非空唯一索引,否则隐式生成 6 字节 rowid。
- 主键设计建议:短小、单调递增(如自增 id 或有序 UUID)。随机主键会导致页分裂、碎片和插入热点;主键过长会让所有二级索引叶子膨胀。
- 主键查询最快(一次查找拿全行),二级索引查询慢一拍(可能回表),覆盖索引可省掉回表。
- MyISAM 不走这套:索引与数据分离,都是非聚簇的。
追问方向:为什么二级索引存主键而非物理地址(避免行移动时全部更新)、回表与覆盖索引的关系。