最近在优化SQL的过程中发现了一个问题:
表:
索引:
SQL:
结果:
可以看到,我明明给year字段创建了索引,但是我查询的时候,并没有走索引;
后来又想到了强制索引,但是依然无效,查询始终不走year字段的索引。
之后在种种猜测下,是不是因为我查询的字段没加引号,因为我的year字段是varchar类型的
果不其然,我的猜测是对的:
SQL:
结果:
至此已经很明显了,这是mysql的隐式转换在作祟,在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引(对隐式转换更多的资料请见参考一)
ps:百度上说使用#{}如果是varchar类型的数据会自动带上引号(真假不知,有待证实研究)