聚簇索引与二级索引的区别及回表查询
什么是聚簇索引(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列)