首頁  >  文章  >  資料庫  >  MySQL中Explain的用法總結(詳細)

MySQL中Explain的用法總結(詳細)

不言
不言轉載
2019-01-07 10:37:446294瀏覽


這篇文章帶給大家的內容是關於MySQL中Explain的用法摘要(詳細),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

執行計劃(query Execution plan)

語法

explain select * from table

explain 中的列

expain出來的資訊有10列,
分別是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面對這些欄位出現的可能進行解釋:

#一、 ID

SQL執行的順序的識別,SQL從大到小的執行

1、ID相同時,執行順序從上到下

2、如果是子查詢,ID的序號會遞增,ID值越大優先權越高,越先被執行

3、ID如果相同,可以認為是一組,從上往下順序執行;在所有群組中,ID值越大,優先權越高,越先執行

二、select_type

示查詢中每個select子句的類型

1、SIMPLE:簡單的SELECT,不實用UNION或子查詢。

2、PRIMARY:最外層SELECT。

3、UNION:第二層,在SELECT之後使用了UNION。

4、DEPENDENT UNION:UNION語句中的第二個SELECT,依賴外部子查詢。

5、UNION RESULT:UNION的結果。

6、SUBQUERY:子查詢中的第一個SELECT。

7、DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決於外面的查詢。

8、DERIVED:導出表格的SELECT(FROM子句的子查詢)

#9、MATERIALIZED:物化子查詢

10、UNCACHEABLE SUBQUERY:無法快取結果的子查詢,必須為外部查詢的每一行重新計算

11、UNCACHEABLE UNION:UNION 屬於不可緩存的子查詢的第二個或後一個選擇

##三、table

輸出行所引用的表的名稱。這也可以是以下值之一:

  • M##,##N,...>:該行指的是id值為M和id值為N的並集。
  • N

    #>:該行是指用於與該行的衍生表結果id的值 N。例如,派生表可以來自FROM子句中的子查詢

  • N

    >:該行指的是id值為的行的具體化子查詢的結果N

  • 四、type

表示MySQL在表中找到所需行的方式,又稱「訪問類型」。

常用的類型有: NULL, system, const, eq_ref, ref, range, index, ALL(從左到右,性能從差到好)

以下列表描述了從最佳類型到最差類型的連接類型


NULL

 MySQL在最佳化過程中分解語句,執行時甚至不用存取表或索引,例如從索引列中選取最小值可以通過單獨索引查找完成。
system

 該表只有一行(如:系統表)。這是const連線類型的特例
const

 表格最多只有一個符合行,在查詢開頭讀取。因為只有一行,所以最佳化器的其餘部分可以將此行中列的值視為常數。 const表非常快,因為它們只讀一次。

SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;

eq_ref

 對於前面表格中的每個行組合,從該表中讀取一行。除了 system和 const類型之外,這是最好的連接類型。當連接使用索引的所有部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引時使用它。

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
    WHERE ref_table.key_column_part1=other_table.column
    AND ref_table.key_column_part2=1;

ref

 表示上述表格的連接符合條件,也就是哪些資料列或常數被用來尋找索引列上的值
fulltext

 使用FULLTEXT 索引執行連線。
ref_or_null

SELECT * FROM ref_table WHERE key_column IS NULL;
index_merge

 該指數合併存取方法檢索與多行 range掃描和他們的結果合併到一個。此存取方法僅合併來自單一資料表的索引掃描,而不掃描多個資料表。合併可以產生其基礎掃描的聯合,交叉或交叉聯合

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name
WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2
WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2
WHERE t1.key1 = 1
AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

unique_subquery

 此類型取代以下形式的eq_ref某些IN子查詢:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery

 此連線類型類似unique_subquery。它取代IN子查詢,但它適用於以下形式的子查詢中的非唯一索引:

value IN (SELECT key_column FROM single_table WHERE some_expr)

range

 僅檢索給定範圍內的行,使用索引選擇行。的key 輸出行中的列指示使用哪個索引。將key_len包含已使用的時間最長的關鍵部分。該ref列 NULL適用於此類型。  range當一個鍵柱使用任何的相比於恆定可使用=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE ,或IN()運營商:

index

 該index聯接類型是一樣的ALL,只是索引樹被掃描。這種情況有兩種:

1、如果索引是查詢的覆蓋索引,並且可用於滿足表中所需的所有數據,則僅掃描索引樹。在這種情況下,Extra專欄說 Using index。僅索引掃描通常比ALL索引的大小通常小於表格資料更快 。

2、使用索引中的讀取執行全表掃描,以索引順序尋找資料行。 Uses index並沒有出現在 Extra列中。當查詢僅使用屬於單一索引的欄位時,MySQL可以使用此連線類型。

ALL
 對前面表格中的每個行組合進行全表掃描。如果表是第一個未標記的表 const,通常不好,並且在所有其他情況下通常 非常糟糕。通常,您可以ALL透過新增基於常數值或早期表中的列值從表中啟用行檢索的索引來避免

五、possible_keys

該possible_keys列指示MySQL可以選擇在此表中尋找行的索引,指出MySQL能使用哪個索引在表中找到記錄,查詢涉及到的欄位上若存在索引,則該索引將被列出,但不一定被查詢使用

該列完全獨立於EXPLAIN輸出所示的表的順序。這意味著在possible_keys中的某些鍵實際上不能按生成的表次序使用。
如果該欄位是NULL,則沒有相關的索引。在這種情況下,可以透過檢查WHERE子句看是否它引用某些欄位或適合索引的欄位來提高你的查詢效能。如果是這樣,創建一個適當的索引並且再次用EXPLAIN檢查查詢

六、Key

key列顯示MySQL實際決定使用的鍵(索引)

如果沒有選擇索引,鍵是NULL。若要強制MySQL使用或忽略possible_keys欄位中的索引,在查詢中使用FORCE INDEX、USE INDEX或IGNORE INDEX。

七、key_len

表示索引中使用的位元組數,可透過該列計算查詢中使用的索引的長度(key_len顯示的值為索引字段的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是透過表內檢索出的)

不損失精確性的情況下,長度越短越好

八、ref

表示上述表格的連接匹配條件,即哪些列或常數被用來尋找索引列上的值

九、rows

表示MySQL依據表格統計資料及索引選用狀況,估算的找到所需的記錄所需要讀取的行數

##第十、Extra

此Extra欄位EXPLAIN輸出包含MySQL解決查詢的額外資訊。以下列表說明了此列中可能出現的值。每個項目也指示JSON格式的輸出哪個屬性顯示Extra值。對於其中一些,有一個特定的屬性。其他顯示為message 屬性的文字

十一、partitions(擴充)

記錄將與查詢相符的分割區。僅在使用PARTITIONS關鍵字時才顯示此列 。非分區表顯示null

這篇文章到這裡就全部結束了,關於MySQL的更多知識大家可以關注php中文網的

MySQL教學欄位! ! !

以上是MySQL中Explain的用法總結(詳細)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除