https://mp.weixin.qq.com/s/QBReuBhmbgSWhcploKp-qQ
在sql语句中因为字段类型不同,而导致索引失效的问题,很容易遇到,可能是我们日常工作中最容易忽略的问题。
到底怎么回事呢?
请大家注意观察一下t_user表中的code字段,它是varchar
字符类型的。
在sql语句中查询数据时,查询条件我们可以写成这样:
explain
select * from user where code="101";
执行结果:
https://mmbiz.qpic.cn/mmbiz_png/ibJZVicC7nz5ianHlF0AzOr530aPCbgeARxSr5G9x18lcJpxtH6G54kVTBXwHgmjMFcRxSOIOg2PzLShAahnJr5SQ/640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1
从上图中看到,该code字段走了索引。
温馨提醒一下,查询字符字段时,用双引号“和单引号'都可以。
但如果你在写sql时,不小心把引号弄掉了,把sql语句变成了:
explain
select * from user where code=101;
执行结果:
https://mmbiz.qpic.cn/mmbiz_png/ibJZVicC7nz5ianHlF0AzOr530aPCbgeARxZ54Oj4Q6fnDHc10zgmIicZnDksibWDtCqT5DzysgQ2ziawJiaJEbhiaoYTg/640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1
你会惊奇地发现,该sql语句竟然变成了全表扫描。因为少写了引号,这种小小的失误,竟然让code字段上的索引失效了。
这时你心里可能有一万个为什么,其中有一个肯定是:为什么索引会失效呢?
答:因为code字段的类型是varchar,而传参的类型是int,两种类型不同。
此外,还有一个有趣的现象,如果int类型的height字段,在查询时加了引号条件,却还可以走索引: