MySQL 慢查询 —— 值类型与字段类型不一致的隐式转换
文章目录
示例慢 SQL
|
|
场景上下文
- 数据表结构现状
为减少阅读干扰,已去除与本案例无关的字段及索引定义
|
|
原因分析
慢SQL的EXPLAIN
表中存在索引 idx_outer_id_type_id(outer_task_id,task_type_id)
。
字段定义 outer_task_id varchar(64) NOT NULL DEFAULT ''
。
字段类型为字符串,但查询条件的值为整型,导致 MySQL 隐式转换。
列值会被转换成浮点数类型,即 CAST(col_name AS DOUBLE) = XXX
,对列值进行了计算,无法使用索引。
解决方案
程序中强制转换值的类型,与数据库字段类型保持完全一致,避免隐式转换。
|
|
或者使用 CAST
转换查询值:
|
|
优化后的 SQL
|
|
再看优化后的EXPLAIN
知识总结
两个需要比较的值,基本类型不一样时,会发生转换。
整型与字符串的比较,两个值都会被转换成浮点数后再比较。
对索引列进行计算,会导致无法使用索引。
参考资料
文章作者 Jioby
发布日期 2021-08-24
上次更新 2021-08-24
许可协议 CC BY-NC-ND 4.0(请看转载要求)
原文链接 https://shockerli.net/post/mysql-slow-sql-implicit-type-conversion/