一、条件字段函数操作
select count(*) from table where month(字段名) = 7;
由于该字段上面有索引,所以放心的执行这条语句,但是却发现执行了特别久,为什么呢?
因为MySQL的规定,如果对字段做了函数运算,那么就用不上索引了,因为在索引上不知道往哪个方向走了。
但是优化器并不是放弃这个索引了,它会比较主键索引和当前索引的大小,选择走索引小的那个遍历,即选择最优的。
解决办法: 尽量让sql语句不使用函数,sql可以长一点,把所有可能的条件都写上。
二、隐式类型转换
select * from table where 字段=123456;
现在的这个字段数据类型是varchar()类型的,现在sql语句中写的是整型,这里会有一个类型转换。
那么,MySQL中的类型转换规则是什么呢?
字符串和数字做比较的话,是将字符串转换成数字。
对于优化器来说,相当于执行了:
select * from table where CAST(字段 AS signed int) = 123456;/*此字段上面有索引*/
到这里就知道它为什么慢了吧,这个它也是用函数了,所以优化器不会按照索引搜索了。
解决办法: 可以尝试在客户端就把这个转换问题给做好,可以用sql拼接的方法来解决。
三、隐式字符编码问题
在做连接查询的时候,如果两个表的字符集不同,一个是 utf8,一个是 utf8mb4,所以做表连接查询的时候用不上关联字段的索引。
其实内部也是自动用一个函数将字符集向上转换,MySQL规定,用到函数就不能走索引搜索。
解决办法: 将其中一个需要函数转换字符集的表直接把表给改掉,这样就没问题了。