联合索引
完整用到联合索引的情况
- 联合索引各字段作为条件,各字段位置不影响联合索引使用
1 2
select * from t11 where a=1 and b=1 and c=1; select * from t11 where c=1 and b=1 and a=1;
- 联合索引前面字段使用范围查询,后面字段作为条件任然可以完整使用联合索引
1
select * from t11 where a=2 and b in (1,2) and c=2;
- 联合索引前面字段作为条件,后面字段做排序可以使用完整索引
1 2
select * from t11 where a=1 and b=2 order by c; select * from t11 where a=1 order by b,c;
- 对联合索引的字段同时做排序(排序字段顺序要和联合索引中的字段顺序一致),可以完整使用联合索引
1
select a,b,c from t11 order by a,b,c;
部分用到联合索引的情况
- 当条件只包含联合索引前面部分字段时,可以使用部分索引
1
select * from t11 where a=1 and c=1;
联合索引idx_a_b_c(a,b,c)相当于(a),(a,b),(a,b,c)三种索引,称为联合索引的最左原则。
- 当联合索引前面字段使用了范围查询,对后面的字段使用不了索引排序
1
select * from t11 where a=2 and b in (3,4) order by c;
覆盖索引
什么是覆盖索引?
从辅助索引中就可以查询到结果,不需要回表查询聚集索引中的记录。
优势:因为不需要扫描聚集索引,减少了SQL执行过程中的IO次数。
1
2
3
4
5
select b,c from t11 where a=3;
select c from t11 where a=1 and b=1 ;
select id from t11 where a=1 and b=1 and c=1;
不能使用联合索引的情况
- 只使用联合索引后边字段作为条件查询,不使用联合索引(索引最左匹配原则)
1
select * from t11 where b=1;
- 使用联合索引后边的字段排序,不使用联合索引。
1
select * from t11 order by b;
- 联合索引中如果第一个字段作为条件没有出现,那么联合索引后边的字段作为条件都无法使用联合索引。
1
select * from t11 where b=1 and c=1;