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