mysql索引失效

2022-05-07 09:12:13 字數 1263 閱讀 6257

1、條件字段函式操作:

注意:如果對索引欄位做了函式操作,可能會破壞索引值的有序性,優化器會放棄走樹索引樹查詢

原因:select count(*) from tradelog where month(t_modified)=7;

由於b+樹提供的快速定位能力,**於同一層兄弟節點的有序性。當你使用 where t_modified='2018-7-1』的話,引擎就會按照上面綠色箭頭的路線,快速定位到 t_modified='2018-7-1』需要的結果。而 當你使用 where month(t_modified)=7,在傳入第一層的時候,索引就不知道該怎麼走了。

解決方法:

將sql 語句改成基於字段本身的範圍查詢:

mysql> select count(*) from tradelog where

-> (t_modified >= '2016-7-1' and t_modified

-> (t_modified >= '2017-7-1' and t_modified

-> (t_modified >= '2018-7-1' and t_modified

2、條件左側不要有運算,避免索引失效:

比如: select * from a   where id + 1 = 10      ##索引失效

select * from a   where id = 10 -1   #索引生效

3、隱式型別轉換:

查詢用到的字段   跟  表字段的 字段型別不一致。mysql會自動將字段型別轉換,使二者相匹配,在轉換過程中,會用到函式 cast(),導致索引失效

##id為varchar型別  

語句: select * from a   where id  = 10    相當於:   select * from a   where  cast(id  as signed  int) = 10 ;  #由於對索引字段進行了函式計算,導致索引失效

4、隱式字元編碼轉換:

兩個表的字符集不同,乙個是 utf8,乙個是 utf8mb4,在做表連線查詢的時候用不上關聯欄位的索引。

優化方法:主動把 l.tradeid 轉成 utf8,避免被驅動表上的字元編碼轉換

select d.* from tradelog l , trade_detail d where d.tradeid=convert(l.tradeid using utf8) and l.id=2;

mysql索引失效 常見mysql索引失效條件

使用索引的一般語句 1 where條件中有or,除非or的所有欄位都有索引,只要有乙個沒有索引,就不走索引 explain select from jf user ju where ju.user id or ju.superior1 yyy user id是主鍵,superior1是普通索引,結果...

mysql 主鍵失效 MySQL索引(索引失效)

索引 索引也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄。myisam儲存引擎,資料檔案 索引檔案 表結構檔案分開儲存 innodb儲存引擎,資料和索引儲存在乙個檔案中 b tree索引 hash索引 hash索引 只有memory儲存引擎支援 查詢一條記錄的速度非常快 b tree索引 ...

mysql 索引失效場景 Mysql 索引失效場景

例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...