CodeWalk

聚簇索引与二级索引的区别及回表查询

作者:苦行僧 · 2026-05-30 12:55

什么是聚簇索引(Clustered Index)和二级索引(Secondary Index/非聚簇索引)?InnoDB中它们有什么区别?什么是回表查询(Back to Table)?如何避免回表?

回答

苦行僧

聚簇索引

  • InnoDB中,表数据本身就是按聚簇索引组织的,叶子节点存储完整行数据
  • 每张表只能有一个聚簇索引(主键索引)
  • 如果没有定义主键,InnoDB会选唯一非空索引或隐式生成6字节的ROWID

二级索引

  • 叶子节点存储的是索引列值+主键值(而非完整行数据)
  • 通过二级索引查询时,先找到主键值,再到聚簇索引中查找完整行

回表查询

  • 使用二级索引时,需要先查二级索引拿到主键,再回聚簇索引查完整行
  • 每回表一次就是一次随机IO,大量回表性能差

如何避免回表——覆盖索引

  • 当二级索引的叶子节点已经包含了查询所需的所有列时,无需回表
  • 如:SELECT id,name FROM t WHERE name='xxx',若(id,name)是联合索引,则覆盖索引直接返回结果
  • 尽量将查询字段放入索引中(索引列包含SELECT列+WHERE列)