mysql索引失效的情況


  • 兩表的關聯字段類型不一致,導致索引失效。

可以用SHOW FULL COLUMNS FROM 表名查看表結構,主要看Collation這一列,如果倆表的關聯的字段的排序規則不一致,會導致索引失效。

可以通過工具修改字符集和排序規則

  • 索引不會包含有NULL值的列,只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對於此復合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。
  • 使用短索引,對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是唯一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
  • 索引列排序,MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那么orderby中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。
  • like語句操作,一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like“%aaa%”不會使用索引而like“aaa%”可以使用索引。
  • 不要在列上進行運算,例如:select from users where YEAR(adddate)<2007,將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:select from users where adddate<’2007-01-01′。關於這一點可以圍觀:一個單引號引發的MYSQL性能損失。​
  • 不使用NOTIN、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
  • 索引要建立在經常進行select操作的字段上,這是因為,如果這些列很少用到,那么有無索引並不能明顯改變查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
  • 索引要建立在值比較唯一的字段上
  • 對於那些定義為text、image和bit數據類型的列不應該增加索引,因為這些列的數據量要么相當大,要么取值很少。
  • where的查詢條件里有不等號(wherecolumn!=…),mysql將無法使用索引
  • 如果where字句的查詢條件里使用了函數(如:whereDAY(column)=…),mysql將無法使用索引
  • 在join操作中(需要從多個數據表提取數據時),mysql只有在主鍵和外鍵的數據類型相同時才能使用索引,否則及時建立了索引也不會使用
  • ​MySQL只對一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like(不以通配符%或_開頭的情形)。
  • or語句前后沒有同時使用索引。當or左右查詢字段只有一個是索引,該索引失效,只有當or左右查詢字段均為索引時,才會生效
  • 組合索引,不是使用第一列索引,索引失效。
  • 數據類型出現隱式轉化。如varchar不加單引號的話可能會自動轉換為int型,使索引無效,產生全表掃描。比如 select id from table where name = “AA”
  • 在索引字段上使用not,<>,!=。不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。 優化方法: key<>0 改為 key>0 or key<0。
  • 對索引字段進行計算操作、字段上使用函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM