技巧💡
- 如果一个索引包含(或者说覆盖)所有需要查询的字段的值。我们称之为“覆盖索引”。如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要再回表查询呢?
- 索引覆盖的优先级比索引下推高。
从普通索引中就可以得到查询的记录,不需要查询聚簇索引中的记录了。可以减少大量的IO操作
使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。
索引覆盖的优先级比索引下推高(此规则,不确定与优化器优化是否有关联)
^4dfc81
技巧💡
当可以进行索引覆盖,和 server层过滤时,会优先使用索引覆盖。只有当索引覆盖满足不了时,才会进行索引下推。原因,是因为索引下推要回表查询,导致比较慢?还是因为优化器的问题?
```sql
-- 索引下推(复合索引情况下使用), using index condition
select * from user where name = 'xx' and age > 12;
-- using index, using where 这个为什么不是索引下推,很迷惑。我理解是这里不需要回表,可以进行索引覆盖,优先级比索引下推高。
select name from user where name = 'xx' and age > 12;