mysql - 我可以在不破坏 INDEX 的情况下将 VARCHAR 转换为 INT 吗?

标签 mysql performance indexing casting

需要搜索表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/

相关文章:

mysql - 用户设置的数据库设计

android - 如何连接2个文件

python - 如何使用 np.where() 创建特定行的新数组?

data-structures - 随机化数组的有效方法 - Shuffle 代码

python - 运行 Pairwise Distance 函数后如何维护或恢复 Dataframe 索引?

sql - 如何使用 Oracle 12c 查询为 JSON 中的数组编制索引?

php - 使用 AJAX + PHP 插入 MySQL 数据库

mysql - 如何将 "limit"中的字符串参数转换为 int

mysql - 聚集索引还是分区表?

mysql - 性能最佳的 MySQL 服务器配置?