_Releted: 18.为什么这些SQL语句逻辑相同,性能却差异巨大?.pdf _
字段的计算、函数操作
SELECT COUNT(*) FROM tradelog WHERE month(t_modified)=7;
WHERE stuno+1 = 900001;
WHERE LEFT(student.name, 3) = 'abc';
WHERE from_unixtime(create_time) = ’2014-05-29’隐式的类型转换
SELECT * FROM tradelog WHERE tradeid=110717;
# 但是 tradeid 是 varchar(32)
# 对于优化器来说,其实执行的 sql 是:
SELECT * FROM tradelog WHERE CAST(tradid AS signed int) = 110717;隐式的字符编码转变
两表进行 join 操作时,两个表 join on 的字段编码类型不同,一个是 utf8,一个是 utf8mb4。
其他情况
- 最左前缀匹配。对于联合索引,第几个位置无法匹配,则后续均不能使用索引。如果第一个无法匹配,则该索引无法使用。
- 范围条件右边的列索引失效
- 不等于(!= 或者<>)索引失效。不考虑覆盖索引的情况
- is null 可以使用索引,is not null 无法使用索引
- like 以通配符%开头索引失效
- OR 前后存在非索引的列,索引失效