1、概念介绍
1.1、官话
一个索引包含(或者说覆盖)所有需要查询的字段的值
1.2、白话
一条查询语句的所有字段都被一条辅助索引所包含,例如select c, d from A where a = 1 order by b, 若该A表有一个联合索引(a,b,c,d),则该辅助索引就是覆盖索引。mysql会自动利用辅助索引,若该条索引满足覆盖索引的前提。(tips:辅助索引上包含主键,所以select c, d, id from A where a = 1 order by b也能利用联合索引(a,b,c,d),假设id是主键)
1.3、原理
若一个查询的所有字段都可以在一条索引上找到,那么mysql将会直接利用该条索引(也就是覆盖索引)查找符合的数据,不会再需要到主键索引上去取数据了,也就是减少了一次回表查询的操作。简而言之,就是覆盖索引仅使用了表的部分列数据查找,而不是全部列,所以省了时间。
2、实战应用
2.1、案例一
select a from A where b = 1
建立联合索引(b, a)则可以使用覆盖索引
2.2、案例二
select * from A where b = 1 and c like '%张三%' limit 100000, 10
覆盖索引典型应用场景,分页查询中搭配延迟关联,在子查询中可以使用覆盖索引查询需要返回的主键,减少mysql需要获取的数据行。针对以上查询,建立联合索引(b, c),即使c字段模糊查询无法使用索引,但是该联合索引可以使用覆盖索引。修改后查询语句如下
select * from A join (select id from A where b = 1 and c like '%张三%' limit 100000, 10) t using (id)