MySQL-12丨联合索引

Posted by jiefang on October 28, 2019

联合索引

完整用到联合索引的情况

  • 联合索引各字段作为条件,各字段位置不影响联合索引使用
    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;