表a_table
的索引位于string_column
我有一个问题:
SELECT * FROM a_table WHERE string_column = 10;
我使用EXPLAIN
来查找没有使用索引
为什么?你能帮我解决MySQL文档链接吗?
答案 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 无法使用索引。
有关详细信息,请查看此内容: