1. 程式人生 > >MySql 的效能分析和索引建立與優化

MySql 的效能分析和索引建立與優化

1、索引簡單語法

  • 建立 CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length)); ALTER mytable ADD [UNIQUE ] INDEX [indexName] ON (columnname(length));

  • 刪除 DROP INDEX [indexName] ON mytable;

  • 展示 SHOW INDEX FROM table_name\G

2、MySql 的效能分析

  • 檢視執行計劃 Explain + SQL語句
  • 怎麼看/每個欄位的意思 在這裡插入圖片描述

主要欄位分析

  • id

    select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序 相同:從上而下 不同:從大到小 相同不同:先大小後從上到小

  • type

      顯示查詢使用了何種型別,從最好到最差依次是:
            system>const>eq_ref>ref>range>index>ALL
    
  • key

    實際使用的欄位,查詢中若使用了覆蓋索引,則該索引和查詢的select欄位重疊
    
  • Extra

      包含不適合在其他列中顯示但十分重要的額外資訊
                  Using filesort  查詢排序中的欄位 ,不推薦
                  Using temporary  使用臨時表是 ,索引必定失效
                  USING index 效率最好的
       Using where 使用where 語句進行查詢
    
  • select_type

      查詢的型別,主要是用於區別 普通查詢、聯合查詢、子查詢等的複雜查詢
      simple primary subquery(子查詢)、 derived(子查詢的衍生)、UOION、UNION RESULT
    
  • ref

         顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查詢索引列上的值
    

3、索引優化

  • Join語句的優化 儘可能減少Join語句中的NestedLoop的迴圈總次數;“永遠用小結果集驅動大的結果集”。 在這裡插入圖片描述 優先優化NestedLoop的內層迴圈; 保證Join語句中被驅動表上Join條件欄位已經被索引; 當無法保證被驅動表的Join條件欄位被索引且記憶體資源充足的前提下,不要太吝惜JoinBuffer的設定;
  • 建立索引的原則和索引失效的 1、全職匹配我最愛 2、最佳左字首法則 3、不在索引列上做任何的操作(計算、函式、自動或手動型別轉換 ),會造成索引失效導致全表掃描 4、索引、儲存引擎不能使用索引中範圍條件右邊的列 5、儘量使用索引覆蓋(只訪問索引查詢列),避免select * 6、MySql在使用不等於時,會導致 7、is null 、is not null 也無法使用索引 8、like 以萬用字元(‘%acv’)會引起索引失效,% 要在最右邊 9、字串不用’'引號處理會索引失效 10、少用or,用它來連線時會引起索引失效
  • 一般性的建議 對於單鍵索引儘量選擇針對當前query過濾性 在選擇組合索引的時候。當前Query中過濾性最好的欄位在索引欄位順序中儘量靠前使用 在選擇組合索引的時候,儘量選擇可以能夠包含當前query中的where字句中更多欄位的索引 儘可能通過分析統計資訊和調整query的寫法來達到選擇合適索引的目的