[详解]隐式类型转换导致的索引失效问题

文章探讨了MySQL中隐式类型转换如何影响索引选择,指出VARCHAR主键与INT值的SQL查询差异,以及为何第一种情况索引失效。强调了根据索引类型编写SQL的重要性。
摘要由CSDN通过智能技术生成

究竟为什么隐式转换就会导致索引失效呢?

现在有一个普通学生表 S(学号,姓名,年龄,性别,专业)
在这里插入图片描述
执行如下语句查看表中索引,共有两个索引

SHOW INDEX FROM s;

sno代表(学号)为主键索引类型为varcharsage(年龄)普通索引类型为int
在这里插入图片描述
现在比较两个sql语句

EXPLAIN SELECT * FROM s WHERE sno = 95020103;
EXPLAIN SELECT * FROM s WHERE sno = '95020103';

上面哪一个会走索引呢?注意sno为varchar类型的主键索引

答案:第一个语句出现索引失效问题!走了全表扫描
在这里插入图片描述
第二个语句走了索引
在这里插入图片描述
为什么呢?原因是我们在MySQL在执行的时候优化了我们的语句!
因为我们主键索引类型定义为varchar而我们sql语句指定的类型为int
MySQL优化器会直接将索引列隐式转换为int类型 [我们的聚簇索引是根据varchar来建立的!]从而导致了索引失效!

相信你已经有所领悟了!现在再让我们看一下下面俩个语句哪个会走索引:
注意 sage类型为int,且作为普通索引

EXPLAIN SELECT * FROM s WHERE sage = '21';
EXPLAIN SELECT * FROM s WHERE sage = 21;

哪一个会导致索引失效呢?
答案是都会走索引!且执行语句一模一样! why???小伙伴们可能有点懵x了!
在这里插入图片描述在这里插入图片描述
好家伙按照控制变量法给你试出来了:MySQL中的 ‘21’ = 21?
答案是:没错!执行如下语句一探究竟

SELECT '21' = 21;

在这里插入图片描述
原来MYSQL默认优化语句的时候varchar可以向下主动转型为int;但是int无法转为varchar
【注意:这就是为什么第一个案例出现了索引失效问题!】

总结:

在编写SQL语句层面确实varchar类型可自动转为int类型(优化器做的事)但是int类型无法向上转型为varchar!出现索引失效问题根源在于我们要根据建立索引的相应类型来写具体where后的索引列SQL语句!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值