1. 程式人生 > >mysql 查詢優化 ~ 索引失效

mysql 查詢優化 ~ 索引失效

一 explain
  1 掃描行數根據的是表的統計元資料
  2 索引的元資料具體指的就是show index from查到的索引的區分度,索引的區分度越高越好
  3 表的元資料是定期收集,所以可能不準確
  4 如果感覺explain不準確,可以用analyze table t命令重新收集
  5 元資料不準確的場景大多出現在大量刪除資料和插入資料場景,針對大表尤其如此
二 元資料收集
  引數 innodb_stats_persistent=ON 預設會持久化到記憶體 預設開啟
  引數 innodb_stats_auto_recalc 這個引數控制著在表中行的數量改變超過10%的時候,是否重新收集統計資訊 這個收集的動作是非同步的,在執行完大的dml後,可能會過一段時間才重新收集統計資訊 預設開啟
  引數 innodb_stats_persistent_sample_pages 取樣使用的頁數 預設20 1 調大可能使analyze命令緩慢,加重負擔 2調小可能使大量的執行計劃產生誤區,並不建議調整此值
三 mysql優化器選擇錯誤索引的方法
  1 採用force index強制走某項索引,但是這可能導致一個問題,以後系統遷移或者索引名變更會導致問題
  2 改寫sql語句,讓mysql優化器進行再次判斷,選擇正確的索引
  3 直接刪除索引本身,讓mysql優化器無法選擇該索引
四 總結
 1 如果出現mysql執行計劃不準確的情況下,可以採用上述方式進行處理,一般情況下,出現索引判斷失誤的情況比較少