MySQL查询不走索引的原因--最左匹配原则

MySQL中查询索引的语句为:show index from table_name;

show index from student;

查询后的结果:

每个字段的含义可以查看博客:

如何查询Oracle、MySQL、SQL server中表的索引_蓝星部队的博客-CSDN博客

其中seq_in_index是索引中的列序列号,从1开始。如果是联合索引则会从1开始,数字递增,联合索引一般不超过5列。

很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,执行计划中根本没有使用到索引!

一般来说,可能某些字段没有创建索引,或是联合索引中字段的顺序与查询语句中字段的顺序不符。

联合索引时会遵循最左原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

举例说明一下:

1、第一种情况:where条件中同时用到了联合索引的两个字段--sno/sname,那么执行计划中就可以看到走了索引。查询速度也很快。

2、第二种情况:如果只是查询联合索引中的第一个字段sno,那么执行计划也是走索引的,速度很快。

3、第三种情况:如果只是查询联合索引中的第二个字段sname,那么执行计划就不走索引,直接全表扫描,速度会变慢。

说明:明显感觉到查询速度的不同,如果使用了联合索引0.003s,不使用联合索引3s,相差1000倍。

最后,如果联合索引有3个字段,分别是字段A、字段B、字段C。在查询时,如果仅仅使用字段B和字段C作为条件,那么是不会这个索引的。
走索引的条件格式为:ABC(ACB/BAC/BCA/CAB/CBA,mysql会自动优化成第1种ABC)/AB/A
不走索引的条件格式为:C/BC

假设有这样一个索引——(a,b,c),针对下面的5个关于最左原则的解释,做出举例。
1.必须用到索引的第一个字段,如select * from table where b='b' and c='c',不会使用到索引。
2.对于索引的第一个字段,用like时左边必须是固定值,通配符只能出现在右边,如select * from table where a like '%a%'不会使用到索引,而select * from table where a like 'a%'则会使用到索引。
3.如果在字段前加了函数或在字段前嵌入了表达式,则不会使用索引。如select * from table where trim(a)>1不会使用索引,select * from table where a+1>1也不会使用索引,而select * from table where a>2会使用到索引。
4.索引的使用与where语句中字段出现的顺序无关,只与是否使用到索引相关字段有关。如select * from table where b='b' and a='a'也会使用索引。
5.使用到索引第一个字段的不等于表达式,即使其他字段不是索引字段也会使用到索引。如select * from table where a!='a' and ddd='ddd'会使用到索引。

根据选择性的好坏创建索引:

列选择性:列的属性值唯一值越大,选择性越好,适合创建索引。如身份证号(1/14亿)>民族(1/56)>性别(1/2)选择性一次降低。

条件选择性:条件范围越小,选择性越好。time>‘2000-01-01’好于time>‘2020-01-01’。

创建索引的字段的值不能是频繁更改的字段,银行卡的余额就不适合创建索引,卡号就适合创建索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值