我在我的工作场所使用 MySQL 5.1 版。
我my_cloumn char(10)
在my_table
.
我最近发现一个过程需要更长的时间,负责这个的 SQL 如下:
SELECT * FROM my_table WHERE my_column = 12345
,这可能需要大约 3 分钟的运行时间。
现在,以这种方式在搜索字符串上编辑和使用引号
SELECT * FROM my_table WHERE my_column = '12345'
在几微秒内检索记录。
我无权(直接或间接)更改代码以通过引号传递查询(通过直接 sql 或在 PDO 中指定正确的数据类型),并且当前可能无法在用户访问时更改列使用数据库。我最需要的是如何解释上述差异。
为什么有引号而不是没有引号会更快?
引号将表达式定义为字符串,而没有单引号则将其计算为数字。这意味着 MySQL 被迫执行类型转换以将数字转换为 aCHAR
以进行适当的比较。
正如上面的文档所说,
对于字符串列与数字的比较,MySQL 无法使用列上的索引来快速查找值。如果 str_col 是索引字符串列,则在执行查找时无法使用该索引...
然而,相反的情况并非如此,虽然可以使用索引,但使用字符串作为值会导致执行计划不佳(如 jkavalik 的sqlfiddle 所示),其中using where
使用了而不是更快的using index condition
。两者的主要区别在于前者需要行查找,后者可以直接从索引中获取数据。
您绝对应该尽快将列数据类型(假设它确实仅意味着包含数字)修改为适当的数据类型,但请确保没有查询实际上使用单引号,否则您将回到开始的地方。
归档时间: |
|
查看次数: |
1615 次 |
最近记录: |