二级索引的叶子节点并不存储一行完整的表数据,而是存储了聚簇索引所在列的值。
(图片来源于网络)
由于二级索引的叶子节点不存储完整的表数据,索引当通过索引查询到聚簇索引列值后,还需要回到聚簇索引也就是表数据本身进一步获取数据。
(图片来源于网络)
回表查询 需要额外的 B+tree 搜索过程,必然增大查询耗时。
需要注意的是,通过二级索引查询时,回表不是必须的过程,当 SELECT 的所有字段在单个二级索引中都能够找到时,就不需要回表,MySQL 称此时的二级索引为覆盖索引或触发了索引覆盖。
可以用 Explain 命令查看 SQL 语句的执行计划,执行计划的 Extra字段中若出现 Using index,表示查询触发了索引覆盖。