mysql explain 命令講解

weixin_34054866發表於2016-05-26

explian命令可以顯示select語句的執行計劃

explain的結果中每行對應select語句中的一個表,輸出結果中的順序是按照語句處理表的順序。 mysql使用巢狀迴圈來處理所有的join連線。 當使用了關鍵字extended後,explain可以檢視到"show warnings"語句的內容,以及被過濾的列。

關鍵字"extented"和"partitions"不能一起使用,在5.6.5之後,這兩個關鍵字都不可以和"format"一起使用。

mysql> explain select * from emp ,dept where emp.deptno=dept.deptno;
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | emp   | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  1 | SIMPLE      | dept  | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
2 rows in set (0.00 sec)

mysql> explain select * from dept,emp where emp.deptno=dept.deptno;
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | dept  | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  1 | SIMPLE      | emp   | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
2 rows in set (0.00 sec)

mysql> explain select * from (select * from ( select * from emp where id=1) a) b;
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  2 | DERIVED     | <derived3> | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  3 | DERIVED     | emp        | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
3 rows in set (0.01 sec)

mysql>

 

1.id (JSON name: select_id)
 select識別符號,在查詢中該值是順序的數字。如果該行是其它行union的結果,該值可以為null。


2.select_type (JSON name: none)

select_type的取值列表

取值 json name 說明
simple   簡單的select查詢(沒有union、沒有子查詢)
primary   最外層的查詢
union   union中的第二個或後面的select語句
dependent union dependent (true) union中的第二個或後面的select語句,對外查詢有依賴
union result union_result union的結果集
subquery   子查詢中的第一個查詢
dependent subquery dependent (true) 子查詢中的第一個查詢,對外層查詢有依賴
derived   派生表的select(from子句的子查詢)
materialized materialized_from_subquery 物化的子查詢
uncacheable subquery cacheable (false) 結果不能被快取的子查詢,外層查詢需要使用的時候都要重新執行一次
uncacheable union cacheable (false) union中的第二個或者後面的不能被快取的子查詢

 

 

 

 

 

 

 

 

 

 

 

 

3.table (JSON name: table_name)  

<unionM,N>:表示是M行和N行結果的union;<derivedN>:表示派生自N行的結果;<subqueryN>: 引用N行的物化的子查詢

 

4.partitions (JSON name: partitions)
 查詢涉及的分割槽


5.type (JSON name: access_type)
 join的型別

 

6.possible_keys

possible_keys列指出MySQL可以使用的索引。注意,該列完全獨立於EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實際上不能按生成的表次序使用。

如果該列是NULL,則沒有相關的索引。在這種情況下,可以通過檢查WHERE子句看是否它引用某些列或適合索引的列來提高你的查詢效能。如果是這樣,創造一個適當的索引並且再次用EXPLAIN檢查查詢

 

7.key (JSON name: key)

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

要想強制MySQL使用或不使用possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

 

8.key_len (JSON name: key_length)

key_len列顯示MySQL決定使用的鍵長度。如果鍵是NULL,則長度為NULL。 使用的索引的長度。在不損失精確性的情況下,長度越短越好

 

9.ref (JSON name: ref)

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

 

10.rows (JSON name: rows)

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

 

11.filtered (JSON name: filtered)

表的行數的過濾的百分比

 

12. Extra

包含MySQL執行查詢使用的其它資訊:

看到 Using filesort 和 Using temporary 的時候,查詢就需要優化了。

相關文章