需要搜索表foo
foo结构是
id |某事
字段something
有一个INDEX
我想在 BETWEEN AS INT 之间搜索:
SELECT CAST(something as INT) as something_int FROM foo foo_1
WHERE something_int > 1 AND something_int < 9999
在这种情况下,索引会被使用还是被破坏?
最佳答案
WHERE some_varchar BETWEEN '1' AND '2000' -- fast but probably incorrect
WHERE some_varchar BETWEEN 1 AND 2000 -- slow but correct
WHERE some_int BETWEEN '1' AND '2000' -- fast
WHERE some_int BETWEEN 1 AND 2000 -- fast (same as previous)
发生了什么?
- 比较文本与数字时,将文本侧转换为数字,然后进行数字比较。
- 文本到文本的比较是字符串比较; numeric to numeric 进行数字比较。
- 上面,我说“慢”是指不能使用索引;如果可以使用索引,则“快”。
- “不正确”的问题与对
VARCHAR
中的一组数字进行排序具有相同的问题。然后想知道为什么列表乱序:1,10,11,...,19,2,20,...,29,3,... -
CAST()
只是我在这里讨论的隐式转换的显式版本。 -
CAST('2000' TO INT)
是“在编译时”完成的,因此优化器将其简单地视为2000
(数字,无函数调用)。 -
some_varchar >= 1
另一方面,变成CAST(some_varchar TO INT) >= 1
在上面的第二个例子中。 - 根据经验,“在函数调用中隐藏列可以防止使用索引。请参阅维基百科中的“sargable”。
关于mysql - 我可以在不破坏 INDEX 的情况下将 VARCHAR 转换为 INT 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59718641/