mysql 中的隱式轉換導致sql變慢

2021-10-06 14:56:11 字數 1871 閱讀 4187

線上跑了乙個慢sql,檢視表結構,表裡面有order_no的唯一索引

此處注意mysql查詢隱式轉換的導致問題,當查詢條件左右兩側型別不匹配是,就會發生隱式轉換,導致索引無法起作用

庫里有一張表,有欄位order_no(varchar),final_amount(decinal):

分別有唯一索引order_no和正常索引final_amount

我們使用: explain select * from orders where order_no = 『20190324030381』

從執行計畫中可以看出sql走了索引,當我們使用:explain select * from orders where order_no = 20190324030381

可以看到當我們沒有使用引號時,sql進行的是全表檢索

使用:explain select * from orders where final_amount > 1000

sql走索引

使用: explain select * from orders where final_amount > 『1000』

同樣走了索引

當字段等號兩側型別不一致,會發生隱式轉換,cast(index_filed as signed),然後和字段對比。當欄位varchar時,我們查詢20190324030381,欄位varchar轉化為int,再與20190324030381比較,那麼庫里』20190324030381』,『a20190324030381』,『20190324030381a』 均可轉化成20190324030381,那麼表就無法使用索引,只能全表轉化檢索。對於int型,發生隱性轉化時,有int轉化為varchar,1000只會轉化成』1000』,所以可以走索引

延伸的拓展驗證了datetime,使用:explain select * from orders where complete_at > 『2020-05-25』

走了索引,使用:explain select * from orders where complete_at > 2020-05-25

沒有走索引,而且感受下執行速度

這不是慢了一點點啊,所以查詢的時候一定謹記,對於varchar、datetime查詢條件一定要加引號

越知道你就越不知道,技術有限,理解有限,歡迎指正~

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

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

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

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

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

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