1. 程式人生 > 其它 >MySQL 哪些情況下索引會失效

MySQL 哪些情況下索引會失效

眾所周知,MySQL索引是以B+樹儲存的,而且是否使用索引是由引擎決定的,當MySQL覺得走索引花費開銷大時,反而會放棄走索引。

總結一下,哪些情況下會使索引失效:

  1. 對where條件中的欄位進行了函式操作,比如month(t_modified)=7;
  2. 隱式型別轉換,比如where id_card=111, id_card是varchar, 而輸入是111,需要做型別轉換。MySQL預設將字串轉換為整數。如果索引欄位是整數,條件是字串,則會將條件轉換為整數,不會影響走索引
  3. 隱式字元編碼轉換。比如表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%`用不了索引

總而言之,不要對索引欄位做函式操作,可能會破壞索引值的有序性,因此優化器決定放棄走樹搜尋功能