MySql的隐式类型转换导致的索引失效
这个问题出自今天和AI聊天时发现的一个问题:假设 a 是 varchar、值全是数字,WHERE a=1(无引号)——这算不算索引失效?
答案是会失效
-- 假设 a 是 varchar(32),索引 idx_a(a)
-- 执行如下 SQL:
SELECT * FROM t WHERE a = 1; -- ❌ 索引失效(或效果极差)
-- 正确写法:
SELECT * FROM t WHERE a = '1'; -- ✅ 走索引
当索引列和传入值不一样时Mysql会优先将索引列转换为数值类型再比较
-- 实际执行时,MySQL 内部会这样处理:
WHERE a = 1
-- 等价于:
WHERE CAST(a AS SIGNED) = 1 -- 对索引列进行函数操作!
原创
MySql的隐式类型转换导致的索引失效
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法