对索引字段进行函数操作、隐式类型转换或字符编码转换都可能导致MySQL优化器放弃使用索引,从而影响查询性能。定期使用EXPLAIN
命令分析SQL语句的执行计划,是提升数据库性能的有效方法。
案例一:条件字段函数操作
tradelog
中统计每年7月份的交易记录总数。使用month(t_modified)=7
作为条件时,尽管t_modified
字段上有索引,查询性能却很差。month()
),会导致优化器放弃使用索引的快速定位功能,从而进行全索引扫描。month()
函数。案例二:隐式类型转换
tradelog
表中,使用整型值查询tradeid
字段(类型为varchar
)时,导致全表扫描。--这里条件判断时,使用了整型
select * from tradelog where tradeid=110717;
案例三:隐式字符编码转换
tradelog
和trade_detail
两个表时,由于字符集不一致,例如一个是 utf8,一个是 utf8mb4,导致无法使用索引进行快速查询。select d.* from tradelog l , trade_detail d where d.tradeid=CONVERT(l.tradeid USING utf8) and l.id=2;