问题概述
今天在上班时,DBA突然找出来一段sql,说造成主从服务器延迟过大。经过查看是一个根据主键更新的语句,重新执行这句sql,执行了将近10秒钟,很是吃惊,通过排查发现是主键类型varchar的字段, 我们使用条件传入了数值型的值,导致没有经过索引。
问题重现
我们准备了两个表,一个表的主键是varchar类型,一个表的主键是int类型,分别执行以下语句:
1.表1的主键类型为varchar,分别执行如下两条语句:
SELECT * FROM table1 WHERE reportId = 1152921504880208203;
SELECT * FROM table1 WHERE reportId = '1152921504880208203';
通过explain发现第一条sql没有使用索引,第二条sql使用索引,这两条语句的差异就是第二条语句我们给数值加上了引号,加上引号后,就使用了索引。
2.表2的主键类型是int,也分别执行这两条语句:
SELECT * FROM table2 WHERE reportId = 1152921504880208203;
SELECT * FROM table2 WHERE reportId = '1152921504880208203';
通过explain发现这两条sql都使用了索引。
结论
当我们使用的字段是数值类型时,加引号或者不加引号(sql中单引号和双引号实现相同效果)都不影响索引的使用
当我们的字段是字符串类型时,不加引号的查询无法使用索引,加引号的查询才可正常使用索引