1. 程式人生 > >mysql explain工具使用

mysql explain工具使用

nbsp rom 使用 exp 信息 mysql 資源 解釋 ive

explain工具可以確認執行計劃是否良好,查詢是否走了合理的索引。查詢的執行計劃,隨著數據的變化也可能會有變化。調用方式:explain + [sql語句]。

另外,explain是有局限性的:
1. 不會說明觸發器、存儲過程、自定義函數對查詢的影響情況;
2. 不考慮各種Cache情況;
3. 不能顯示執行查詢時所做的優化工作;
4. 部分信息是估算的,並非精確值;
5. mysql 5.6之前,只能解釋select操作,其他操作需要重寫為select之才查看執行計劃。
6. 如果from裏有子查詢,explain可能會執行這個子查詢。所以,如果有耗資源很大的子查詢,使用explain會產生很大的開銷。

各列字段的解釋,如下:

1. id,一組數字,操作順序,如果id相同,則執行順序由上至下。如果是子查詢,id的序號會遞增,值越大則優先級越高,越先被執行。

2. select_type,表示每個子句的類型,簡單還是復雜,取值有如下幾種:

  a) simple:簡單查詢,無子查詢或union等;
  b) primary:查詢中若包含任何復雜的子部分,最外層則被標記為primary;
  c) subquery:在select或where中若包含子查詢,則該子查詢被標記為subquery;
  d) derived:from中包含子查詢,被標記為derived;
  e) union:若select出現在union之後,則被標記為union;
  f) union result:從union表中獲取結果的select將被標記為union result;
3. type,找到所需行的方式,又稱訪問類型,取值有如下幾種,由最差到最好:

  a) all:全表掃描。
  b) index:遍歷索引,全索引掃描。
  c) range:索引範圍掃描。
  d) ref:非唯一性索引掃描,交返回匹配單獨值的所有行,常見於使用非唯一性索引或唯一性索引的非唯一前綴進行的查找。
  e) eq_ref:唯一性索引掃描。
  f) const、system:當mysql對查詢的某部分進行優化,並轉換為一個常量時。如將主鍵置於where列表中,mysql就能將該查詢轉換為一個常量。system是const的特例,當查詢的表只有一行的情況下,即可使用system。
4. possible_keys: 指出mysql能使用哪個索引在表中找到行,查詢涉及的字段上若存在索引,則該索引將被列出,但不一定會被查詢使用到。

5. key:使用到了哪個索引,這裏列出的是實際使用到的索引,若沒有使用索引,則顯示為null。

6. ref:連接匹配條件,即哪些列或常量用於查找索引上的值。

7. rows:找到所需記錄,需要讀取的行數,越少越好。

8. Extra:不適合在其他列顯示,但卻十分重要的信息,常見的有如下值:
  a) Using index:使用了覆蓋索引。
  b) Using where:where條件未使用索引。
  c) Using temporary:需要使用臨時表來存儲結果集,常見於排序和分組查詢。性能差。
  d) Using filesoft:使用了文件排序,性能差。

mysql explain工具使用