2013-05-28 115 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 不能使用使用索引。

請看看本作進一步的細節: