MySQL 哪些情況下索引會失效
阿新 • • 發佈:2022-03-09
眾所周知,MySQL索引是以B+樹儲存的,而且是否使用索引是由引擎決定的,當MySQL覺得走索引花費開銷大時,反而會放棄走索引。
總結一下,哪些情況下會使索引失效:
- 對where條件中的欄位進行了函式操作,比如
month(t_modified)=7
; - 隱式型別轉換,比如
where id_card=111
, id_card是varchar, 而輸入是111,需要做型別轉換。MySQL預設將字串轉換為整數。如果索引欄位是整數,條件是字串,則會將條件轉換為整數,不會影響走索引 - 隱式字元編碼轉換。比如表A 時utf8,表B是 utfmb4,表A join 表B查詢,導致連線的欄位需要進行字串編碼轉換,比如
select * from trade_detail where CONVERT(traideid USING utf8mb4)=$L2.tradeid.value;
如果線上不允許更改表的字串編碼,就只能才有修改SQL的方式了
mysql> select d.* from tradelog l , trade_detail d where d.tradeid=CONVERT(l.tradeid USING utf8) and l.id=2;
4. 模糊搜尋,目前只有
LIKE 'aaa%' 這種可以用到索引,其他如
LIKE %a%`用不了索引
總而言之,不要對索引欄位做函式操作,可能會破壞索引值的有序性,因此優化器決定放棄走樹搜尋功能