MySQL:整数值和字符串字段与索引的比较

时间:2013-05-28 07:20:52

标签: mysql indexing query-optimization

a_table的索引位于string_column 我有一个问题:

SELECT * FROM a_table WHERE string_column = 10;

我使用EXPLAIN来查找没有使用索引 为什么?你能帮我解决MySQL文档链接吗?

更新:Sandbox (SQL Fiddle)

1 个答案:

答案 0 :(得分:12)

关键是,如果数据库必须在比较的表侧进行转换,则无法使用索引。

除此之外,DB总是会转换字符串 - >数字,因为这是确定性的方式(否则1可以转换为'01','001',如评论中所述)。

所以,如果我们比较两个似乎让你困惑的案例:

-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';

DB将字符串“1”转换为数字1,然后执行查询。它最终在双方都有int,所以它可以使用索引。

-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;

同样,它将字符串转换为数字。但是,这次它必须转换存储在表中的数据。实际上,您正在执行cast(str_column as int) = 1之类的搜索。这意味着,您不再搜索索引数据,DB 无法使用索引。

有关详细信息,请查看此内容: