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

2021-10-02 05:53:06 字數 1262 閱讀 3458

在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的時候注意最好都加上引號,避免這種字串型別的不走索引的情況發生

mysql 隱式轉換 mysql中的隱式轉換

在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。下面分析兩種隱式轉換的情況 看表結構 phone為 int型別,name為 varchar 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但...

mysql 關閉隱式轉換 Mysql中的隱式轉換

在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引,下面分析兩種隱式轉換的情況看表結構phone為int型別,name為varchar型別 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但因為...

mysql日期隱式轉換 mysql中的隱式轉換

什麼隱式型別轉換?在mysql中 當操作符與不同型別的運算元一起使用時,會發生型別轉換以使運算元相容。則會發生轉換隱式 也就是說,mysql會根據需要自動將數字轉換為字串,將字串轉換數字。看到這個概念之後,是不是有一種茅塞頓開的感覺。哦.原來在資料結構中telephone欄位為字串 varchar ...