create table testsql(id int(11),name varchar(11),descid varchar(11));在mysql查詢中,當查詢條件左右兩側的型別不匹配就會發生隱式轉換;常見的比如 varchar 轉化為 int 如下面的查詢alter table testsql add index(descid) alter table testsql add
unique(id) insert into testsql
values(1,『123』,『1』),(2,『123a』,『2』),(3,『639』,『3』) select * from
testsql;
tablename: testsql fieldname:id,name,descid
select * from testsql where name = 123
實際執行的時候,會把上面的 sql語句轉化為:
select * from testsql where cast(name as signed int) = 123
如果隱式轉換在索引列,那麼該索引失效,效率大大降低!
示列:
explain select * from testsql where descid = 1
分析第一行,sql 沒有走索引:因為查詢條件左右兩邊的資料型別不匹配 descid 發生了 隱式轉換 。使用了cast函式進行轉換,一旦對索引字段使用函式操作,mysql將放棄使用索引。但是當對主鍵使用上述操作時:
是都會走索引查詢的,這是為什麼呢?
因為 int 型別的數字只有1能轉化為』1』,是唯一確定的。所以雖然需要隱式轉換,但不影響使用索引
1, 兩個引數至少有乙個是 null 時,比較的結果也是 null,例外是使用 <=>
對兩個 null 做比較時會返回 1,這兩種情況都不需要做型別轉換
2, 兩個引數都是字串,會按照字串來比較,不做型別轉換
3, 兩個引數都是整數,按照整數來比較,不做型別轉換
4, 十六進製制的值和非數字做比較時,會被當做二進位制串
5, 有乙個引數是 timestamp 或 datetime,並且另外乙個引數是常量,常量會被轉換為 timestamp
6, 有乙個引數是 decimal 型別,如果另外乙個引數是 decimal 或者整數會將整數轉換為 decimal 後進行比較,
如果另外乙個引數是浮點數,則會把 decimal 轉換為浮點數進行比較
7, 所有其他情況下,兩個引數都會被轉換為浮點數再進行比較
其實我預期效果應該是 第一條,但是第二條也顯示出來了。我們在update delete 處理的時候 ,可能會發現自己不小心 有多刪一條,或者多修改一條 可以檢查一下是否是上述的原因
寫完sql 記得 explain 看一下執行計畫是否走索引
查詢條件兩邊的型別要一致;發生型別轉化可能會造成誤操作
如何看懂explain:
參考文章為:
mysql 隱式轉換 mysql中的隱式轉換
在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。下面分析兩種隱式轉換的情況 看表結構 phone為 int型別,name為 varchar 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但...
mysql隱式轉換
定義 當操作符與不同型別的運算元一起使用時,會發生型別轉換以使運算元相容。則會發生轉換隱式 舉乙個常見例子 1 我們先建立乙個表,有關手機號查詢 create table user id int 11 not null primary keyauto increment phone varchar ...
mysql 隱式轉換 談談MySQL隱式型別轉換
前言今天我們繼續回到mysql系列文章中,談一談mysql中隱式型別轉換。其實我最早知道是在慢sql優化中知道隱式型別轉換概念的 在說隱式型別轉換之前,首先我們通過乙個例項來看看是怎麼回事。資料結構 本文中所有的操作,都是基於該資料結構 有興趣的童鞋,可以實驗 create table t base...