数据库的回表和覆盖索引
数据库的回表和覆盖索引
回表
SELECT c1, c2, c3 FROM test_table WHERE c1 =1
如果这里 c1 建立了索引,就会直接根据索引查到 c1 的 rowid(rowid 是一个物理id,每条数据一个,全局唯一),然后根据 rowid 再查询表中的数据,这个过程就是回表。
如果索引中已经有了所有结果的值,那就不用根据 rowid 返回,就不用回表操作。频繁的回表也会影响性能。包含所有满足查询需要的数据的索引就称为覆盖索引(Covering Index)
使用 explain 分析 sql 语句,extra 列显示 using index 就表示为索引覆盖查询。
组合索引一般就是为了索引覆盖查询。
注意
-
覆盖索引也并不适应于任意的索引类型,索引必须存储列的值。像 Hash,full-text 索引不存储值,所以在 MySQL 下只有 b+ 树的索引可以。
-
不同的存储引擎实现覆盖索引的方式是不同的,也有的存储引擎不支持覆盖索引。
Read other posts