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 的時候,查詢就需要優化了。