三十八、【进阶】最左前缀法则

1、理解

        最左前缀法则,如果索引了多列(联合索引),要遵守最左前缀法则,最左前缀法则是致,查询从索引的最左列开始,并且不跳过索引中的列。

        如果跳过某一列,索引将部分失效(该索引后面的字段索引全部失效)。

2、最左前缀法则

(1)案例准备

三十八、【进阶】最左前缀法则_第1张图片

将使用如下语句来诠释最左前缀法则:

三十八、【进阶】最左前缀法则_第2张图片

(2)查询表中索引

三十八、【进阶】最左前缀法则_第3张图片

(3)使用联

        在使用联合索引查询tb_user表时,可以看到可能用到的索引为“idx_user_pro_age_sta”,实际用到的索引也是它,索引的长度为54

explain select * from tb_user where profession='软件工程' and age=31 and status='0';

三十八、【进阶】最左前缀法则_第4张图片

(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”,表示全表扫描,不走索引。

        这是为什么呢?

        这是因为在使用联合索引时,联合索引最左边的字段必须出现,按顺序依次出现,否则索引查询就会失效。

三十八、【进阶】最左前缀法则_第5张图片

(7)跳过索引的第一、二字段查询

        再次查询tb_user表,使用字段为“status”字段,可以看到查询方式依旧为“全表扫描”,没有使用索引查询,因为其不符合最左前缀法则。

三十八、【进阶】最左前缀法则_第6张图片

(8) 不使用联合索引的第二字段查询

        再次查询tb_user表,联合索引查询,使用第一个字段“profession”和第三个字段“status”进行查询,可以看到查询方式为“索引查询”,但注意到,其索引长度为47,在前面的查询中,我们知道字段“profession”的长度为47,可见字段“status”查询并未生效,这是因为查询过程中跳过了第二个字段“age”不符合最左前缀法则

(9) 更换顺序

        在上述案例中,我们比较详细的分析了最左前缀法则,但此时,我们有一个疑问,如果我在使用联合索引查询时,调换了索引的顺序,会不会导致查询失败?

三十八、【进阶】最左前缀法则_第7张图片

        如上图所示,我们在使用联合索引时,调换了字段的位置,依旧可以使用联合索引查询,这是因为and表示并列关系,并无先后递进关系。

3、范围查询

(1)基本

        在联合索引中,如果出现范围查询(>,<),会导致范围查询右侧的列索引失效。

三十八、【进阶】最左前缀法则_第8张图片

(2)范围查询导致右边索引失效

(3)解决方案:

        在业务允许的范围内,将<&>改为<=&>=;

你可能感兴趣的:(MYSQL,搜索引擎,adb,mysql,数据库)