聚簇索引和非聚簇索引的区别

📅 2026/6/16 12:46:04
聚簇索引和非聚簇索引的区别
1. 什么是聚簇索引Clustered IndexInnoDB 中PRIMARY KEY(id)对应的索引就是聚簇索引。特点数据和索引存储在一起。例如主键索引(BTree) 10 / \ / \ 5 20 叶子节点 1 - 用户1完整数据 2 - 用户2完整数据 3 - 用户3完整数据叶子节点保存整行数据例如id1,nameTom,age18聚簇索引特点叶子节点存放完整记录所以select * from user where id 1;过程主键索引 ↓ 定位叶子节点 ↓ 获得完整数据只查一次树。2. 什么是非聚簇索引二级索引例如create index idx_name on user(name);这是普通索引。又叫Secondary Index 二级索引 辅助索引叶子节点存什么不是完整数据。而是索引列 主键值例如Tom - 1 Jack - 2 Lucy - 3这里1、2、3其实就是主键ID3. 查询过程区别假设select * from user where nameTom;第一步先查普通索引idx_name Tom - 1得到id 1第二步再去主键索引查id 1找到完整行数据整个过程普通索引 ↓ 获取主键id ↓ 主键索引 ↓ 获取数据这个过程叫回表Back To Table4. 为什么会有回表因为二级索引叶子节点没有保存完整数据。只保存索引列 主键值例如Lucy - 3数据库拿到id3之后必须再查一次聚簇索引获取name age address ...5. 什么情况不会回表例如select id,name from user where nameTom;二级索引name id已经包含id name需要的数据都在索引里。无需再查主键树。这叫覆盖索引Covering Index执行计划EXPLAIN会看到Using index说明没有回表6. 聚簇索引和非聚簇索引对比对比项聚簇索引非聚簇索引数量只能一个可以多个对应主键索引普通索引、唯一索引叶子节点完整数据主键值查询次数一次两次(回表)查询速度更快稍慢是否回表不会可能会存储顺序按主键顺序按索引列顺序7. 为什么只能有一个聚簇索引因为数据只能按照一种顺序存储例如数据按id排序存储1 2 3 4 5那就不可能同时按name排序存储Jack Lucy Tom因此聚簇索引只能有一个而普通索引可以有很多个因为它们只是额外维护的BTree。面试标准答案InnoDB 中主键索引是聚簇索引其叶子节点存储完整数据记录因此通过主键查询时只需查一次 BTree 即可获取数据。普通索引属于非聚簇索引二级索引其叶子节点存储的是索引列和主键值而不保存完整数据。查询时先通过二级索引找到主键再通过主键索引获取完整记录这个过程称为回表。如果查询字段全部包含在二级索引中则可以直接返回结果形成覆盖索引避免回表提高查询性能。由于数据只能按一种物理顺序存储因此一个表只能有一个聚簇索引但可以有多个非聚簇索引。