基於mysql資料庫 關於sql優化的一些問題

maidouerer發表於2018-10-19

mysql資料庫有一個explain關鍵詞,可以對select語句進行分析並且輸出詳細的select執行過程的詳細資訊。

對sql explain後輸出幾個欄位:

  • id:SELECT查詢的識別符號,每個SELECT語句都會自動分配一個唯一的識別符號

  • select_type:每個select查詢字句的型別

    型別名 解釋
    SIMPLE 簡單SELECT,不使用UNION或子查詢等
    PRIMARY 查詢中若包含任何複雜的子部分,最外層的select被標記為PRIMARY
    UNION UNION中的第二個或後面的SELECT語句
    DEPENDENT UNION UNION中的第二個或後面的SELECT語句,取決於外面的查詢
    UNION RESULT UNION的結果
    SUBQUERY 子查詢中的第一個SELECT
    DEPENDENT SUBQUERY 子查詢中的第一個SELECT,取決於外面的查詢
    DERIVED 派生表的SELECT, FROM子句的子查詢
    UNCACHEABLE SUBQUERY 一個子查詢的結果不能被快取,必須重新評估外連結的第一行
  • table:顯示這一行的資料是查哪張表的,不過有時短路顯示的不是真實的表名。

  • type:訪問型別,表示MySQL在表中找到所需行的方式。type作為訪問型別,其值代表著當前查詢所用的型別,是體現效能的一個重要指標,從表中可以看到,從上到下,掃描表的方式越來越寬,效能也就越來越差,因此,對於一個查詢,最好能保持在range級別以上。

    型別名 優級別 解釋
    system 1 表僅有一行
    const 2 表最多有一個匹配行,在查詢開始時即被讀取
    eq_ref 3 使用primary key或者unique key作為多表連線的條件,僅從該表中讀取一行
    ref 4 作為查詢條件的索引在每個表匹配索引值的行從表中讀取出來
    fulltext 5 全文索引檢索
    ref_or_null 6 和ref一致,但增加了NULL值查詢支援
    index_merge 7 表示使用了索引合併優化方法
    unique_subquery 8 使用了替換了in子查詢
    index_subquery 9 使用了替換了in子查詢,但只適用於子查詢中的非唯一索引
    range 10 只檢索給定範圍的行,使用一個索引來選擇行
    index 11 全表掃描,但掃描表的方式是按索引的次序進行
    ALL 12 全表掃描的方式找到匹配的行
  • possible_keys:主動指出查詢能用哪個索引在表中找到記錄
    也就是會列出在查詢中的欄位中有索引的欄位,但不一定被查詢所用。

  • key: 顯示再查詢中實際使用的索引/鍵,如果沒有索引,則顯示NULL。
    但如果想強制查詢中使用或忽視possible_keys列中的索引,則可以在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

  • key_len:表示索引中使用的位元組數。

  • ref:表示哪些列或常量被用於查詢索引列上的值。

  • rows:顯示當前查詢估算到的查詢到匹配記錄所需的記錄行數。

  • Extra:顯示當前查詢所用的解決方式。

    型別名 解釋
    Using where 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,
    Using temporary 表示MySQL需要使用臨時表來儲存結果集,常見於排序和分組查詢
    Using filesort MySQL中無法利用索引完成的排序操作稱為“檔案排序”
    Using join buffer 改值強調了在獲取連線條件時沒有使用索引,並且需要連線緩衝區來儲存中間結果。如果出現了這個值,那應該注意,根據查詢的具體情況可能需要新增索引來改進能。
    Impossible where 這個值強調了where語句會導致沒有符合條件的行。
    Select tables optimized away 這個值意味著僅通過使用索引,優化器可能僅從聚合函式結果中返回一行

explain常用於分析sql查詢執行過程,以此便於分析。

相關文章