查詢分析器 desc 和 explain 作用基本一樣,explain速度快一點
explain 一條SQL語句出出現以下參數, 其中id,select_type,table 用於定位查詢,表示本行參數所對應的SQL查詢部分

- id
SELECT 識別符,這是SELECT的查詢序列號,不重要,需要注意的是,不要把id當成執行順序,這並不准確
- select_type
可以分為以下幾種:
1、 SIMPLE: 指示非子查詢和union的簡單查詢。
select * from class
2、PRIMARY:指示在有子查詢的語句中最外面的select, 主查詢。
select * from class where class_id in (select class_id from student)
3、UNION:指示使用union語句的第二個或者后面的select。
select name from teachers union select name from students
4、DEPENDENT UNION: 子查詢union語句的第二個或者后面的select。
5、UNION RESULT: union語句的結果集
select * from class where class_id in (select class_id from teachers union select class_id from students);
6、SUBQUERY: 子查詢中的語句, 與union相反理解就行了。
7、DEPENDENT SUBQUERY: 子查詢中的第一個語句。
select * from class where class_id in (select class_id from students)
8、DERIVED: 派生表的SELECT(FROM子句的子查詢)。
select * from (select class_id,class_name from class)
- table
就是表名,本行記錄對應查詢所應用的表。可以通過table表名幫助定位查詢。
使用explain時,有時table字段顯示的並不是表名, 而是derived2 或 derived3等等。。。即derived X 代表的是id為X的查詢所得到的結果集。例如:
EXPLAIN SELECT so.storeorder_id,so.storeorder_sn,si,stores_name from ec_stores_order so INNER JOIN (SELECT stores_id, stores_name from ec_stores_info where stores_creatorid=2) si on so.store_id=si.stores_id
explain該語句就會得到 derived 2 的table
- partitions
- type(重點)
連接類型。查詢效率的關鍵,下面按照從最佳類型到最壞類型進行排序
從最好到最差的連接類型為const、eq_ref、ref、range、index和all。
1、system
存在於手冊中(沒怎么見過),最好的連接類型,時候const聯接類型的一個特例。
2、const
表最多有一個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優化器剩余部分認為是常數。const表很快,因為它們只讀取一次! 即在查詢主鍵索引或是唯一索引時使用。
select * from table where id=1 //主鍵查詢
3、eq_ref
在連接查詢時,連接字段使用主鍵或是唯一索引時被使用,很常見
4、ref
與eq_ref相對,在連接查詢時,連接字段使用非主鍵或是唯一索引的普通索引、單列索引或是組合索引的左前綴時被使用,該連接方式可以在索引列范圍查詢(< = >)時被使用
ref,使用非唯一索引掃描或者唯一索引的前綴掃描,返回匹配某個單獨值的記錄行。
5、ref_or_null
連接的索引列中有null值,ref就會變成這個
6、index_merge
該聯接類型表示使用了索引合並優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。
7、unique_subquery
該類型替換了IN子查詢。
unique_subquery是一個索引查找函數,可以完全替換子查詢,效率更高。只適用於主鍵或唯一索引。
8、index_subquery
該聯接類型類似於unique_subquery。可以替換IN子查詢,但只適合非唯一索引。
9、range
只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該類型中ref列為NULL。
當使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關鍵字列時,可以使用range。
10、index
該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小。
當查詢只使用作為單索引一部分的列時,MySQL可以使用該聯接類型。(會掃描整棵索引樹)
11、ALL
沒有用到索引,將掃描全表記錄,應極力避免。
- possible_keys
可能能用到的索引,沒太大卵用~
- key(關鍵)
用到的索引名,關鍵。查詢效率與索引引用息息相關
- key_len
MySQL使用的索引長度
- ref
如果是使用的常數等值查詢,這里會顯示const,如果是連接查詢,被驅動表的執行計划這里會顯示驅動表的關聯字段,如果是條件使用了表達式或者函數,或者條件列發生了內部隱式轉換,這里可能顯示為func
引用到的上一個表的列
- rows
顯示查詢掃描的行數,顯然數據越小越好
- filtered
表示存儲引擎返回的數據在server層過濾后,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數。
- Extra
查詢的詳細信息,包含所有其它操作,列如
Distinct,using,index,using where,Using union等
