MySQL優化-EXPLAIN執行計劃

在MySQL中可以使用EXPLAIN查看SQL執行計劃。
本文章採用tb_item商品表、tb_order訂單表、tb_user用戶表作爲例子。
查看sql的執行計劃,例子如下:
EXPLAIN SELECT * FROM tb_item
在這裏插入圖片描述

EXPLAIN 結果說明

id

SELECT識別符。這是SELECT查詢序列號。這個不重要。

select_type

表示SELECT語句的類型。

有以下幾種值:
1、 SIMPLE
表示簡單查詢,其中不包含連接查詢和子查詢。
2、 PRIMARY
表示主查詢,或者是最外面的查詢語句。
在這裏插入圖片描述
3、 UNION
表示連接查詢的第2個或後面的查詢語句。
在這裏插入圖片描述
4、 DEPENDENT UNION
UNION中的第二個或後面的SELECT語句,取決於外面的查詢。
5、 UNION RESULT
連接查詢的結果。
6、 SUBQUERY
子查詢中的第1個SELECT語句。
在這裏插入圖片描述
7、 DEPENDENT SUBQUERY
子查詢中的第1個SELECT語句,取決於外面的查詢。
8、 DERIVED
SELECT(FROM 子句的子查詢)。

table

表示查詢的表。

type(重要)

表示表的連接類型。
以下的連接類型的順序是從最佳類型到最差類型:

1、 system
表僅有一行,這是const類型的特列,平時不會出現,這個也可以忽略不計。
2、 const
數據表最多隻有一個匹配行,因爲只匹配一行數據,所以很快,常用於PRIMARY KEY或者UNIQUE索引的查詢,可理解爲const是最優化的。
在這裏插入圖片描述
3、 eq_ref
mysql手冊是這樣說的:“對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了const類型。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY”。eq_ref可以用於使用=比較帶索引的列。
在這裏插入圖片描述
4、 ref
查詢條件索引既不是UNIQUE也不是PRIMARY KEY的情況。ref可用於=或<或>操作符的帶索引的列。
在這裏插入圖片描述
5、 ref_or_null
該聯接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經常使用該聯接類型的優化。

上面這五種情況都是很理想的索引使用情況。

6、 index_merge
該聯接類型表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
7、 unique_subquery
該類型替換了下面形式的IN子查詢的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。
8、 index_subquery
該聯接類型類似於unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
9、 range
只檢索給定範圍的行,使用一個索引來選擇行。
在這裏插入圖片描述
10、 index
該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因爲索引文件通常比數據文件小。
11、 ALL
對於每個來自於先前的表的行組合,進行完整的表掃描。(性能最差)

possible_keys

指出MySQL能使用哪個索引在該表中找到行。
如果該列爲NULL,說明沒有使用索引,可以對該列創建索引來提高性能。

key

顯示MySQL實際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL。

可以強制使用索引或者忽略索引:
在這裏插入圖片描述

key_len

顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度爲NULL。

注意:key_len是確定了MySQL將實際使用的索引長度。

ref

顯示使用哪個列或常數與key一起從表中選擇行。

rows

顯示MySQL認爲它執行查詢時必須檢查的行數。

Extra

該列包含MySQL解決查詢的詳細信息
• Distinct:MySQL發現第1個匹配行後,停止爲當前的行組合搜索更多的行。
• Not exists:MySQL能夠對查詢進行LEFT JOIN優化,發現1個匹配LEFT JOIN標準的行後,不再爲前面的的行組合在該表內檢查更多的行。
• range checked for each record (index map: #):MySQL沒有發現好的可以使用的索引,但發現如果來自前面的表的列值已知,可能部分索引可以使用。
• Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。
• Using index:從只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的列信息。
• Using temporary:爲了解決查詢,MySQL需要創建一個臨時表來容納結果。
• Using where:WHERE 子句用於限制哪一個行匹配下一個表或發送到客戶。
• Using sort_union(…), Using union(…), Using intersect(…):這些函數說明如何爲index_merge聯接類型合併索引掃描。
• Using index for group-by:類似於訪問表的Using index方式,Using index for group-by表示MySQL發現了一個索引,可以用來查 詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實際的表。

索引查詢

索引可以提供查詢的速度,但並不是使用了帶有索引的字段查詢都會生效,有些情況下是不生效的,需要結合執行計劃查看!

使用LIKE關鍵字的查詢

在使用LIKE關鍵字進行查詢的查詢語句中,如果匹配字符串的第一個字符爲“%”,索引不起作用。只有“%”不在第一個位置,索引纔會生效。
在這裏插入圖片描述
在這裏插入圖片描述

使用聯合索引的查詢

MySQL可以爲多個字段創建索引,一個索引可以包括16個字段。對於聯合索引,只有查詢條件中使用了這些字段中第一個字段時,索引纔會生效。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

使用OR關鍵字的查詢

查詢語句的查詢條件中只有OR關鍵字,且OR前後的兩個條件中的列都是索引時,索引纔會生效,否則,索引不生效。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章