2013-05-28 86 views
4

a_table的索引号为​​。
我有一个查询:MySQL:整数值与字符串字段与索引的比较

SELECT * FROM a_table WHERE string_column = 10; 

我以前EXPLAIN地发现,没有使用索引。
为什么?你能帮助我与MySQL文档链接?

更新:Sandbox (SQL Fiddle)

+2

请参阅本页面http://dev.mysql.com/doc/refman/4.1/ en/mysql-indexes.html ..第3项重点不同列的比较可能会阻止使用索引,如果无法直接比较值而不进行转换。假设数字列与字符串列进行比较。对于数字列中的给定值(例如1),它可能与字符串列中的任何数量的值(例如'1','1','00001'或'01 .e1')等同。这就排除了对字符串列使用任何索引。' – Meherzad

+0

实际上,10不是一列(我之前在文档中看到过这个文本)。所以它可以转换为必要类型的字符串。 – DmitryR

+1

检查此http://sqlfiddle.com/#!2/f4807/1为字符串到int转换索引使用虽然我使用'强制索引.. – Meherzad

回答

8

最重要的一点是,如果数据库必须做比较的表侧转换的索引不能被使用。

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

请看看本作进一步的细节: