_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 前后存在非索引的列,索引失效