sql性能分析(explain關鍵字)


explain關鍵字結果

列名所代表的的含義:

Id:MySQL QueryOptimizer 選定的執行計划中查詢的序列號。表示查詢中執行 select 子句或操作表的順序,id 值越大優先級越高,越先被執行。id 相同,執行順序由上至下。

     Select_type一共有9中類型,只介紹常用的4:

          SIMPLE: 簡單的 select 查詢,不使用 union 及子查詢

          PRIMARY: 最外層的 select 查詢

          UNION: UNION 中的第二個或隨后的 select 查詢, 依賴於外部查詢的結果集

          DERIVED: 用於 from 子句里有子查詢的情況。 MySQL 遞歸執行這些子查詢, 把結果放在臨時表里。

     Table:輸出行所引用的表

     Type:從有到差的順序如下:

System-->const-->eq_ref-->ref-->ref_or_null-->index_merge-->unique_subquery-->index_subquery-->range-->index-->all.

各自的含義如下:

          system:  表僅有一行(=系統表)。這是 const 連接類型的一個特例。

          const:  const 用於用常數值比較 PRIMARY KEY 時。當 查詢的表僅有一行時,使用 System

          eq_ref: 從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

          ref:  連接不能基於關鍵字選擇單個行,可能查找 到多個符合條件的行。 叫做 ref 是因為索引要 跟某個參考值相比較。這個參考值或者是一 個常數,或者是來自一個表里的多表查詢的 結果值。

          ref_or_null:  如同 ref, 但是 MySQL 必須在初次查找的結果 里找出 null 條目,然后進行二次查找。

          index_merge: 說明索引合並優化被使用了。

          unique_subquery:  在某些 IN 查詢中使用此種類型,而不是常規的 ref:valueIN (SELECT primary_key FROM single_table WHERE some_expr)

          index_subquery:  IN 使 , unique_subquery 類似,但是查詢的是非唯一 性索引

          range:  只檢索給定范圍的行,使用一個索引來選擇 行。key 列顯示使用了哪個索引。當使用= <>>>=<<=IS NULL<=>BETWEEN 或者 IN 操作符,用常量比較關鍵字列時, 以使用 range

          index:  全表掃描,只是掃描表的時候按照索引次序 進行而不是行。主要優點就是避免了排序, 但是開銷仍然非常大。

          all: 最壞的情況,從頭到尾全表掃描。

     possible_keys : 指出能在該表中使用哪些索引有助於 查詢。如果為空,說明沒有可用的索引。

     key:實際從 possible_key 選擇使用的索引。 如果為 NULL,則沒有使用索引。很少的情況 ,MYSQL 會選擇優化不足的索引。這種情 況下,可以在 SELECT 語句中使用 USE INDEX (indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制 MYSQL 忽略索引

     key_len:  使用的索引的長度。在不損失精確性的情況 ,長度越短越好。

     ref:  顯示索引的哪一列被使用了 

     rows:   認為必須檢查的用來返回請求數據的行數

     extra中出現以下 2 項意味着  根本不能使用索引,效率會受到重大影響。應盡可能對此進行優化。

           Using filesort: 表示 會對結果使用一個外部索引排序,而不是從表里按索引次序讀到相關內容。可能在內存或者磁盤上進行排序。無法利用索引完成的排序操作稱為“文件排序”

          Using temporary:表示對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢group by 

 

     從上述對列名進行介紹,你對性能檢測結果有一個大概的了解了吧.其中typeall的地方,都是需要進行優化的地方.在對sql語句的性能檢測最少也應該到達range,這樣才可以忍受.

 

     當你的工作需要對大量的表進行拼寫的時候,或者你在前期設計表結構的時候,你也可以用explain來檢測你的數據庫表是否是高性能的.別再是拼寫完sql語句就算是完事了,記得要對你的sql語句進行性能檢測,這既是對你自己負責,也是對客戶負責.

     既然檢測出來的結果有all ,那么就需要優化


免責聲明!

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



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