数据库的回表和覆盖索引

回表

SELECT c1, c2, c3 FROM test_table WHERE c1 =1

如果这里 c1 建立了索引,就会直接根据索引查到 c1 的 rowid(rowid 是一个物理id,每条数据一个,全局唯一),然后根据 rowid 再查询表中的数据,这个过程就是回表。

如果索引中已经有了所有结果的值,那就不用根据 rowid 返回,就不用回表操作。频繁的回表也会影响性能。包含所有满足查询需要的数据的索引就称为覆盖索引(Covering Index)

使用 explain 分析 sql 语句,extra 列显示 using index 就表示为索引覆盖查询。

组合索引一般就是为了索引覆盖查询。

注意

  1. 覆盖索引也并不适应于任意的索引类型,索引必须存储列的值。像 Hash,full-text 索引不存储值,所以在 MySQL 下只有 b+ 树的索引可以。

  2. 不同的存储引擎实现覆盖索引的方式是不同的,也有的存储引擎不支持覆盖索引。

https://windmt.com/2018/05/05/mysql-covering-index/