MySql索引失效及解决方案

索引失效的几种情况

1. 索引字段不独立

将计算好的结果提前算好,如select * from student where age=9; 而不是where age -1 =8;

2. 使用or查询
要么不用or要么将or的条件列都加索引,新版本mysql(8以上)会采用索引合并的方式优化查询。

3. 使用了左模糊查询
like ‘%a%’,字符串第一个是模糊的则匹配不上,就失效。
但是like ‘a%’ 是可以使用索引的。

4.字段内部采用了隐式转换
如age = 18写成 age = ‘18’ ,'18’会进行一个转换成18。

5.不符合最左前缀查询

6.补充
(无序)范围中止索引

索引(age,name)
查询条件为 age>18 and name=‘xx’ 左边是范围,右边就会匹配不上,像短路。但是执行器好像会优化顺序成为 name=‘xx’ and age>18,因此name是可用的,而age不可用

索引(age,name)
查询条件为 age=18 and name>‘xx’ age索引可用,name索引无法使用。当age相同时,按
name大小进行排序,范围查询使索引失效。

!= 也会导致索引失效。如age!=18。
试想你去找年龄不等于18,那么在根节点的时候你就不知道往左边走还是往右边走,这时候就迷茫了,迷茫一定等于索引失效。

in(a,b,c)是不能用上索引的。

运算和函数都会导致索引失效。因此尽量简单一点,或者提前进行运算。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值