SQL隐式转换导致索引失效_数据类型不一致
2.数据类型不一致导致索引失效
示例 SQL 如下,SQL 本身很简单,但通过查看执行计划可以发现,此时走的是主键索引,查看表结构发现表的 kemu 是有索引的,且过滤性相对较好。进一步核实,SQL 为何没有走 kemu 索引。
--当前 SQL
SELECT *
FROM XXX
WHERE kemu = 18 # 隐式转换
AND XXX LIKE '%0%'
AND id NOT IN (47193)
ORDER BY id ASC
LIMIT 2
通过 force index 测试,发现还是无法走上索引。此时,开始猜测是否出现了隐式转换。通过 show warnings 可以看到,‘Cannot use ref access on index 'kemu' due to type or collation conversion on field 'kemu'’;此时我们可以知道,由于数据类型或者字符集的原因导致了索引不可用。
后续通过查看表数据结构发现,该列的数据类型为 varchar 类型,而 SQL 中 where 条件在使用时,没有加 '' 号。此时,MySQL是将字符串转换成数字,即此处的 kemu 被CAST(kemu AS signed int),这就相当于对条件字段做了函数操作,优化器放弃⾛树索引定位。
反馈优化意见,kemu 字段为 varchar 类型,SQL查询 where 条件中 “kemu = 18” 存在隐式转换,建议对 SQL 进行改写,具体改写 SQL如下:
--优化后 SQL
SELECT *
FROM XXX
WHERE kemu = '18' # 这里加上了 ''
AND XXX LIKE '%0%'
AND id NOT IN (47193)
ORDER BY id ASC
LIMIT 2