MySQL的EXPLAIN命令結果詳解
explain顯示了mysql如何處理select語句以及連線表。
下面是explain命令的一個例子:
C:\Users\duansf>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.13 MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| workinfo |
+----------------+
1 row in set (0.00 sec)
mysql> explain select * from workinfo\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: workinfo
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1
Extra:
1 row in set (0.00 sec)
mysql>
1、id
SELECT識別符,這是SELECT查詢序列號。這個不重要,查詢序號即為sql語句執行的順序
2、select_type
select型別,它有以下幾種值:
simple:它表示簡單的select,沒有union和子查詢
primary:最外面的select,在有子查詢的語句中,最外面的select查詢就是primary
union:union語句的第二個及以後的子查詢
dependent union:UNION中的第二個及以後的子查詢語句,取決於外面的查詢
union result:UNION的結果
subquery:子查詢中的第一個select語句
dependent subquery:依賴於外查詢的子查詢中的第一個select
derived:子查詢衍生出來的表
materialized:物化子查詢
uncacheable subquery:不能被快取,需要重新評估的子查詢
uncacheable union:union中第二個及以上的uncacheable subquery中需要重新評估的子查詢
3、table
輸出的行所用的表
4、type
連線型別
system:表僅有一行,這是const型別的特列,平時不會出現,這個也可以忽略不計
const:表最多有一個匹配行,const用於比較primary key 或者unique索引。因為只匹配一行資料,所以很快。記住一定是用到primary key或者unique,並且只檢索出兩條資料的情況下才會是const
eq_ref:對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用於使用=比較帶索引的列。
ref:對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。
fulltext:使用全文索引
ref_or_null:該聯接型別如同ref,但是新增了MySQL可以專門搜尋包含NULL值的行。在解決子查詢中經常使用該聯接型別的最佳化。
index_merge:該聯接型別表示使用了索引合併最佳化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
unique_subquery:在帶有in的子句中用來代替ref
index_subquery:類似於unique_subquery,查詢條件
range:給定範圍內的檢索,使用一個索引來檢查行,用到=、<>、>、<、>=、<=、is null、<=>、between、in
ALL:對於每個來自於先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基於前面的表中的常數值或列值被檢索出。
index:該聯接型別與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引檔案通常比資料檔案小。(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)
5、possible_keys
提示使用哪個索引會在該表中找到行
6、keys
查詢實際用到的索引
7、key_len
實際用到的索引長度
8、ref
ref列顯示使用哪個列或常數與key一起從表中選擇行。
9、rows
顯示執行查詢的行數,,數值越大越不好,說明沒有用好索引
10、Extra
查詢語句的額外資訊
下面是explain命令的一個例子:
C:\Users\duansf>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.13 MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| workinfo |
+----------------+
1 row in set (0.00 sec)
mysql> explain select * from workinfo\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: workinfo
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1
Extra:
1 row in set (0.00 sec)
mysql>
1、id
SELECT識別符,這是SELECT查詢序列號。這個不重要,查詢序號即為sql語句執行的順序
2、select_type
select型別,它有以下幾種值:
simple:它表示簡單的select,沒有union和子查詢
primary:最外面的select,在有子查詢的語句中,最外面的select查詢就是primary
union:union語句的第二個及以後的子查詢
dependent union:UNION中的第二個及以後的子查詢語句,取決於外面的查詢
union result:UNION的結果
subquery:子查詢中的第一個select語句
dependent subquery:依賴於外查詢的子查詢中的第一個select
derived:子查詢衍生出來的表
materialized:物化子查詢
uncacheable subquery:不能被快取,需要重新評估的子查詢
uncacheable union:union中第二個及以上的uncacheable subquery中需要重新評估的子查詢
3、table
輸出的行所用的表
4、type
連線型別
system:表僅有一行,這是const型別的特列,平時不會出現,這個也可以忽略不計
const:表最多有一個匹配行,const用於比較primary key 或者unique索引。因為只匹配一行資料,所以很快。記住一定是用到primary key或者unique,並且只檢索出兩條資料的情況下才會是const
eq_ref:對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在一個索引的所有部分被聯接使用並且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用於使用=比較帶索引的列。
ref:對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯接只使用鍵的最左邊的字首,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。
fulltext:使用全文索引
ref_or_null:該聯接型別如同ref,但是新增了MySQL可以專門搜尋包含NULL值的行。在解決子查詢中經常使用該聯接型別的最佳化。
index_merge:該聯接型別表示使用了索引合併最佳化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
unique_subquery:在帶有in的子句中用來代替ref
index_subquery:類似於unique_subquery,查詢條件
range:給定範圍內的檢索,使用一個索引來檢查行,用到=、<>、>、<、>=、<=、is null、<=>、between、in
ALL:對於每個來自於先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,並且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基於前面的表中的常數值或列值被檢索出。
index:該聯接型別與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引檔案通常比資料檔案小。(也就是說雖然all和Index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)
5、possible_keys
提示使用哪個索引會在該表中找到行
6、keys
查詢實際用到的索引
7、key_len
實際用到的索引長度
8、ref
ref列顯示使用哪個列或常數與key一起從表中選擇行。
9、rows
顯示執行查詢的行數,,數值越大越不好,說明沒有用好索引
10、Extra
查詢語句的額外資訊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2105539/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL explain命令詳解MySqlAI
- MySQL的Explain結果輸出項解釋MySqlAI
- MySQL EXPLAIN 命令詳解學習MySqlAI
- MySQL show status命令輸出結果詳解MySql
- mysql explain用法和結果的含義MySqlAI
- MySQL Explain詳解MySqlAI
- MySQL EXPLAIN 詳解MySqlAI
- 詳解 MySQL 中的 explainMySqlAI
- mysql explain 命令講解MySqlAI
- Mysql Explain 詳解 [原創]MySqlAI
- MySQL EXPLAIN結果集分析 - 附帶大量案例MySqlAI
- explain結果含義AI
- MySQL 中的 EXPLAIN 命令MySqlAI
- MySQL執行計劃explain輸出列結果解析MySqlAI
- MySQL EXPLAIN命令詳解學習(檢視執行計劃)MySqlAI
- Mysql效能最佳化(三)--explain返回的結果說明MySqlAI
- MySQL explain 中 key_len的詳解MySqlAI
- EXPLAIN結果含義(轉)AI
- 【工具】TPCC-MySQL 測試結果詳解MySql
- [MySQL 優化] Explain 之 type 詳解MySql優化AI
- MySQL Explain執行計劃 - 詳解MySqlAI
- mysql explain 執行計劃詳解MySqlAI
- MySQL執行計劃EXPLAIN詳解MySqlAI
- MySQL的Explain總結MySqlAI
- FastQC結果詳解AST
- MySQL explain 和 profiling 詳解MySqlAI
- MySQL explain執行計劃詳細解釋MySqlAI
- MySQL命令詳解MySql
- 用 Explain 命令分析 MySQL 的 SQL 執行AIMySql
- 面試前必須知道的MySQL命令【explain】面試MySqlAI
- MySQL EXPLAIN命令的主要專案說明MySqlAI
- mysql flush 命令詳解MySql
- diff詳解,讀懂diff結果
- MySQL show status 命令詳解MySql
- mysql show processlist命令詳解MySql
- RowSet離線結果集物件的使用詳解物件
- Mysql效能調優工具Explain結合語句講解MySqlAI
- MySQL explain結果Extra中"Using Index"與"Using where; Using index"區別MySqlAIIndex