mysql有索引但不走索引的典型场景

1、数据类型发生隐式转换
如下sql 语句中last_name 是varchar类型

  select * from student where last_name = 1;

改进方法,使用正确的数据类型

select * from student where last_name = '1';

2、where 条件表达式等号左侧使用函数

select * from task_table where DATE_ADD(update_time,INTERVAL 2 DAY) < NOW();

改进方法,把函数放到右边,或者在程序中计算好值,推荐在程序中计算,让mysql 少处理逻辑

select * from task_table where update_time > DATEADD(NOW(), INTERVAL - 2 DAY);

3、OR 其中一个条件有索引,另一个没有索引
如下order表中customer_id 有索引, status 列没有索引,如下条件也不能走索引

select * from order where customer_id = 123 or status = 'Y';

改进方法使用union:

select * from order where customer_id = 123
UNION
select * from order where status = 'Y';

4、LIKE 前后%

select * from customer where name like '%明%';

改进方法,如有必要引入es使用全文检索实现类似功能。

5、反向条件

select * from student where name != 'Jone';
select * from student where name not like 'jone%';
select * from student where status not in (1,2,3);

改进方法:如果可以使用正向索引

6、使用多列索引的非首列作为条件
如下例子:假定package 表上有索引 idx(waybill_code,package_code)

select * from package where package_code = 'YD0000000000-1-1';

改进方法,新建package_code 在前的索引,或者修改原有索引的的索引顺序列表顺序idx(package_code,waybill_code)

延伸阅读:
理解mysql b+Tree 索引原理:https://www.jianshu.com/p/486a514b0ded

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值