一:复合索引没有遵守最左前缀
复合索引必须遵守最左前缀,也就是按照复合索引创建的顺序,左边的列必须按顺序出现。
二:在索引列上做了任何操作(计算、函数、类型转换)
例如,SELECT * FROM sys_user WHERE left(login_name, 4) = 'haha',该SQL 使用了内置函数 left(),取出左 4 字符,从 explain 可以知道这个 SQL 语句将会以 ALL 的方式进行全表扫描
上面的 SQL 可以等价替换为 SELECT * FROM sys_user WHERE login_name LIKE 'haha%',这样就可以利用到索引了。
禁止索引列任何计算;不过注意,只是禁止索引列进行计算,如果是对某一个值进行了计算是没有问题的