Mysql 最左前缀原则实践

创建一张表,包含三个字段。

三个字段都是varchar类型的。并且给三个字段做了组合索引

接下来就是验证索引是否生效了

1.查询全部记录
EXPLAIN SELECT * FROM `handler`;

结果为

可以看到 type为ALL ,这便是所谓的“全表扫描”,如果是展示一个数据表中的全部数据项,倒是觉得也没什么,如果是在一个查找数据项的sql中出现了all类型,那通常意味着你的sql语句处于一种最原生的状态,有很大的优化空间。
为什么这么说呢?因为all是一种非常暴力和原始的查找方法,非常的耗时而且低效。用all去查找数据就好比这样的一个情形:S学校有俩万人,我告诉你你给我找到小明,然后你怎么做呢!你当然是把全校俩万人挨个找一遍,即使你很幸运第一个人便找到了小明,但是你仍然不能停下,因为你无法确认是否有另外一个小明存在,直到你把俩万人找完为止。所以,基本所有情况,我们都要避免这样类型的查找,除非你不得不这样做。

2.使用一个索引,且使用仅使用组合索引的第一个索引
EXPLAIN SELECT * FROM `handler` where taskid = '1';

结果为

可以看到他使用了一个索引,key_len用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。

3.使用两个索引,索引顺序按照组合索引
EXPLAIN SELECT * FROM `handler` where taskid = '1' and file_url = 'b';

结果为

可以看到使用了两个索引,且key_len也变大了。

4.使用全部索引,且按照组合索引顺序
EXPLAIN SELECT * FROM `handler` where taskid = '1' and file_url = 'b' and file_md5 = 'bm';

结果为

很明显的看到key_len又增大了,因此全部的索引是生效的。

5.字段类型对索引的影响
EXPLAIN SELECT * FROM `handler` where taskid = 1;

结果为

可以看到type为ALL,rows字段表示可能扫描的行,因为我们的表的数据量只有三行,但是全部扫描了,因此判定当数据类型不一致的时候索引是不生效的

6.条件顺序对索引是否有影响
EXPLAIN SELECT * FROM `handler` where  file_url = 'b' and file_md5 = 'bm' and taskid = '1';

结果为

可以看到尽管我们的where条件顺序与组合索引的顺序不一致,但组合索引还是生效了,而且是写在where中的索引都生效了

7.索引跳跃是否有影响
EXPLAIN SELECT * FROM `handler` where taskid = '1' and file_md5 = 'bm';
EXPLAIN SELECT * FROM `handler` where file_url = 'b' and  file_md5 = 'bm';

结果为

可以看到第一条sql使用一个索引,由于中间缺少了 file_url 字段,因此file_md5的索引是不生效的.因此只使用了一个索引

而第二条sql则是全表扫描。为什么呢,因为它缺少了 taskid,而taskid是组合索引的第一个索引,因此索引一个也没有生效,这或许是最左前缀原则的最好说明。

8.范围查询是否影响索引
EXPLAIN SELECT * FROM `handler` where taskid = '1' and file_url = 'b' and file_md5 > 'cm';

结果为

同样的三个索引都生效了。

9.当sql中出现不等于
EXPLAIN SELECT * FROM `handler` where taskid = '1' and file_url = 'b' and file_md5 != 'cm';
EXPLAIN SELECT * FROM `handler` where taskid != '2' and file_url = 'b' and file_md5 = 'cm';

结果为

可以发现不管 != 出现在哪个位置,都会导致索引失效,从而造成全表扫描

总结

 在使用组合索引时,要尽量保证字段类型一致。同时不要跳跃索引,比如 组合索引为 abcd 而实际sql为 where a  c d 那么cd索引将不会生效。但是 如果是 where dcba 则索引是生效的。另外不要对索引字段使用 != 来判断,否则会导致全部索引失效。

本实践基于:

猜你喜欢

转载自blog.csdn.net/kanyun123/article/details/110947336