MySQL中的隱式轉換造成的索引失效


在mysql查詢中,當查詢條件左右兩側類型不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。

官方的隱試轉換說明:

兩個參數至少有一個是 NULL 時,比較的結果也是 NULL,例外是使用 <=> 對兩個 NULL 做比較時會返回 1,這兩種情況都不需要做類型轉換
兩個參數都是字符串,會按照字符串來比較,不做類型轉換
兩個參數都是整數,按照整數來比較,不做類型轉換
十六進制的值和非數字做比較時,會被當做二進制串
有一個參數是 TIMESTAMP 或 DATETIME,並且另外一個參數是常量,常量會被轉換為 timestamp
有一個參數是 decimal 類型,如果另外一個參數是 decimal 或者整數,會將整數轉換為 decimal 后進行比較,如果另外一個參數是浮點數,則會把 decimal 轉換為浮點數進行比較
所有其他情況下,兩個參數都會被轉換為浮點數再進行比較
常見情況:

  • id為int

SELECT * FROM `test` WHERE id= '10000'; 左邊為int類型10000,轉換為浮點數還是10000,右邊字符串類型'10000',轉換為浮點數也是10000。兩邊的轉換結果都是唯一確定的,沒有破壞索引規則。所以不影響使用索引。

  • id為varchar

SELECT * FROM `test` WHERE id = 10000; 左邊是字符串類型'10000',轉浮點數為10000是唯一的,右邊int類型10000轉換結果也是唯一的。但是,因為左邊是檢索條件,'10000'轉到10000雖然是唯一,但是其他字符串也可以轉換為10000,比如'10000a','010000','10000'等等都能轉為浮點數10000,這樣的情況下,索引規則被破壞,是不能用到索引的。

結論
當我們使用的字段是數值類型時,加引號或者不加引號(sql中單引號和雙引號實現相同效果)都不影響索引的使用
當我們的字段是字符串類型時,不加引號的查詢無法使用索引,加引號的查詢才可正常使用索引
綜上所述,我認為以后寫sql的時候注意最好都加上引號,避免這種字符串類型的不走索引的情況發生

 

 參考文章:

https://blog.csdn.net/yzj5208/article/details/104009416 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM