1、理解
最左前缀法则,如果索引了多列(联合索引),要遵守最左前缀法则,最左前缀法则是致,查询从索引的最左列开始,并且不跳过索引中的列。
如果跳过某一列,索引将部分失效(该索引后面的字段索引全部失效)。
2、最左前缀法则
(1)案例准备
将使用如下语句来诠释最左前缀法则:
(2)查询表中索引
(3)使用联
在使用联合索引查询tb_user表时,可以看到可能用到的索引为“idx_user_pro_age_sta”,实际用到的索引也是它,索引的长度为54。
explain select * from tb_user where profession='软件工程' and age=31 and status='0';
(4) 缺少部分字段
为了验证最左前缀法则,再次查询tb_user表,这次只查询两个字段,分别为“profession”和“age”字段,发现依旧使用索引查询,其索引长度为49,可以得到len(status)=54-49=5。
(5)缺少部分字段
再次查询tb_user表,这次只查询一个字段,为“profession”字段,发现依旧使用索引查询,其索引长度为47,可以得到len(age)=49-47=2。
(6) 跳过联合索引的第一字段查询
再次查询tb_user表,这次查询联合索引的第二个字段和第三个字段,可以看到查询类别是“ALL”,表示全表扫描,不走索引。
这是为什么呢?
这是因为在使用联合索引时,联合索引最左边的字段必须出现,按顺序依次出现,否则索引查询就会失效。
(7)跳过索引的第一、二字段查询
再次查询tb_user表,使用字段为“status”字段,可以看到查询方式依旧为“全表扫描”,没有使用索引查询,因为其不符合最左前缀法则。
(8) 不使用联合索引的第二字段查询
再次查询tb_user表,联合索引查询,使用第一个字段“profession”和第三个字段“status”进行查询,可以看到查询方式为“索引查询”,但注意到,其索引长度为47,在前面的查询中,我们知道字段“profession”的长度为47,可见字段“status”查询并未生效,这是因为查询过程中跳过了第二个字段“age”,不符合最左前缀法则。
(9) 更换顺序
在上述案例中,我们比较详细的分析了最左前缀法则,但此时,我们有一个疑问,如果我在使用联合索引查询时,调换了索引的顺序,会不会导致查询失败?
如上图所示,我们在使用联合索引时,调换了字段的位置,依旧可以使用联合索引查询,这是因为and表示并列关系,并无先后递进关系。
3、范围查询
(1)基本
在联合索引中,如果出现范围查询(>,<),会导致范围查询右侧的列索引失效。
(2)范围查询导致右边索引失效
(3)解决方案:
在业务允许的范围内,将<&>改为<=&>=;