表a_table
上有索引string_column
。
我有一个查询:
SELECT * FROM a_table WHERE string_column = 10;
我曾经EXPLAIN
发现没有使用任何索引。
为什么?你能帮我提供 MySQL 文档链接吗?
表a_table
上有索引string_column
。
我有一个查询:
SELECT * FROM a_table WHERE string_column = 10;
我曾经EXPLAIN
发现没有使用任何索引。
为什么?你能帮我提供 MySQL 文档链接吗?
要点是,如果数据库必须在比较的表端进行转换,则不能使用索引。
除此之外,数据库总是转换字符串 -> 数字,因为这是确定性的方式(否则 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
。这意味着,您不再搜索索引数据,数据库无法使用索引。
请查看此以获取更多详细信息: