11

a_table上有索引string_column
我有一个查询:

SELECT * FROM a_table WHERE string_column = 10;

我曾经EXPLAIN发现没有使用任何索引。
为什么?你能帮我提供 MySQL 文档链接吗?

更新:沙盒(SQL Fiddle)

4

1 回答 1

18

要点是,如果数据库必须在比较的表端进行转换,则不能使用索引。

除此之外,数据库总是转换字符串 -> 数字,因为这是确定性的方式(否则 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。这意味着,您不再搜索索引数据,数据库无法使用索引。

请查看此以获取更多详细信息:

于 2013-05-28T12:00:17.137 回答