Mysql执行计划查看
一、相關參數設定
默認情況下Mysql的profiling是關閉的,所以首先必須打開profiling。
mysql> show variables like "%profiling%";
+------------------------+-------+
| Variable_name????????? | Value |
+------------------------+-------+
| have_profiling???????? | YES?? |
| profiling????????????? | OFF?? |
| profiling_history_size | 15??? |
+------------------------+-------+
3 rows in set (0.00 sec)
mysql> set profiling="ON";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show variables like "%profiling%";
+------------------------+-------+
| Variable_name????????? | Value |
+------------------------+-------+
| have_profiling???????? | YES?? |
| profiling????????????? | ON??? |
| profiling_history_size | 15??? |
+------------------------+-------+
3 rows in set (0.00 sec)
查看現在在運行的所有進程列表,在進程列表中我們唯一需要的是ID
mysql> show processlist;
+----+------+-----------------------+-----------+---------+------+----------+------------------+
| Id | User | Host????????????????? | db??????? | Command | Time | State??? | Info???????????? |
+----+------+-----------------------+-----------+---------+------+----------+------------------+
| 15 | root | 192.168.230.1:57927?? | NULL????? | Sleep?? |? 734 |????????? | NULL???????????? |
| 16 | root | 192.168.230.1:57928?? | datahouse | Sleep?? |? 734 |????????? | NULL???????????? |
| 18 | root | 192.168.230.1:57930?? | datahouse | Sleep?? |? 921 |????????? | NULL???????????? |
| 19 | root | 192.168.230.1:57931?? | datahouse | Sleep?? |? 717 |????????? | NULL???????????? |
| 20 | root | 192.168.230.1:58150?? | NULL????? | Sleep?? |? 110 |????????? | NULL???????????? |
| 21 | root | 192.168.230.132:58579 | NULL????? | Query?? |??? 0 | starting | show processlist |
+----+------+-----------------------+-----------+---------+------+----------+------------------+
6 rows in set (0.00 sec)
mysql>
mysql> show profile cpu,memory for query 3;
+---------------+----------+----------+------------+
| Status??????? | Duration | CPU_user | CPU_system |
+---------------+----------+----------+------------+
| starting????? | 0.000046 | 0.000000 |?? 0.000000 |
| freeing items | 0.000059 | 0.000000 |?? 0.000000 |
| cleaning up?? | 0.000005 | 0.000000 |?? 0.000000 |
+---------------+----------+----------+------------+
3 rows in set, 1 warning (0.00 sec)
二、執行計劃的查看
mysql> use datahouse;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> explain select * from t_user where uid=1;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table? | partitions | type? | possible_keys | key???? | key_len | ref?? | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|? 1 | SIMPLE????? | t_user | NULL?????? | const | PRIMARY?????? | PRIMARY | 8?????? | const |??? 1 |?? 100.00 | NULL? |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
三、EXPLAIN分析結果的含義
1、ID
Query Optimizer 所選定的執行計劃中查詢的序列號。
2、Select_type
所使用的查詢類型,主要有以下這幾種查詢類型
◇ DEPENDENT SUBQUERY:子查詢中內層的第一個SELECT,依賴于外部查詢的結果集。
◇ DEPENDENT UNION:子查詢中的UNION,且為UNION 中從第二個SELECT 開始的后面所有SELECT,同樣依賴于外部查詢的結果集。
◇ PRIMARY:子查詢中的最外層查詢,注意并不是主鍵查詢。
◇ SIMPLE:除子查詢或者UNION 之外的其他查詢。
◇ SUBQUERY:子查詢內層查詢的第一個SELECT,結果不依賴于外部查詢結果集。
◇ UNCACHEABLE SUBQUERY:結果集無法緩存的子查詢。
◇ UNION:UNION 語句中第二個SELECT 開始的后面所有SELECT,第一個SELECT 為PRIMARY
◇ UNION RESULT:UNION 中的合并結果。
3、table
表的名字、顯示這一步所訪問的數據庫中的表的名稱。
4、Type
告訴我們對表所使用的訪問方式,主要包含如下幾種類型
◇ all:全表掃描。
◇ const:讀常量,且最多只會有一條記錄匹配,由于是常量,所以實際上只需要讀一次。
◇ eq_ref:最多只會有一條匹配結果,一般是通過主鍵或者唯一鍵索引來訪問。
◇ fulltext:
◇ index:全索引掃描。
◇ index_merge:查詢中同時使用兩個(或更多)索引,然后對索引結果進行merge 之后再讀取表數據。
◇ index_subquery:子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個主鍵或者唯一索引。
◇ rang:索引范圍掃描。
◇ ref:Join 語句中被驅動表索引引用查詢。
◇ ref_or_null:與ref 的唯一區別就是在使用索引引用查詢之外再增加一個空值的查詢。
◇ system:系統表,表中只有一行數據。
◇ unique_subquery:子查詢中的返回結果字段組合是主鍵或者唯一約束。
5、Possible_keys
該查詢可以利用的索引。 如果沒有任何索引可以使用,就會顯示成null,這一項內容對于優化時候索引的調整非常重要;可能可以利用的索引的名字。這里的索引名字是創建索引時指定的索引昵稱;如果索引沒有昵稱,則默認顯示的是索引中第一個列的名字。默認索引名字的含義往往不是很明顯。
6、Key
MySQL Query Optimizer 從possible_keys 中所選擇使用的索引;它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。
7、Key_len
被選中使用索引的索引鍵長度。
8、Ref
列出是通過常量(const),還是某個表的某個字段(如果是join)來過濾(通過key)的;它顯示的是列的名字(或單詞“const”),MySQL將根據這些列來選擇行。
MySQL文檔關于ref連接類型的說明:“對于每一種與另一個表中記錄的組合,MySQL將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是 UNIQUE或PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一種好的連接類型?!比绻鸈XPLAIN顯示連接類型是“ALL”,而且你并不想從表里面選擇出大多數記錄,那么MySQL的操作效率將非常低,因為它要掃描整個表;可以加入更多的索引來解決這個問題。
9、Rows
MySQL Query Optimizer 通過系統收集到的統計信息估算出來的結果集記錄條數;MySQL所認為的它在找到正確的結果之前必須掃描的記錄數。
10、Extra
查詢中每一步實現的額外細節信息,主要可能會是以下內容:
◇ Distinct:查找distinct 值,所以當mysql 找到了第一條匹配的結果后,將停止該值的查詢而轉為后面其他值的查詢。
◇ Full scan on NULL key:子查詢中的一種優化方式,主要在遇到無法通過索引訪問null值的使用使用。
◇ Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通過收集到的統計信息判斷出不可能存在結果。
◇ No tables:Query 語句中使用FROM DUAL 或者不包含任何FROM 子句。
◇ Not exists:在某些左連接中MySQL Query Optimizer 所通過改變原有Query 的組成而使用的優化方法,可以部分減少數據訪問次數。
◇ Range checked for each record (index map: N):通過MySQL 官方手冊的描述,當MySQL Query Optimizer 沒有發現好的可以使用的索引的時候,如果發現如果來自前面的表的列值已知,可能部分索引可以使用。對前面的表的每個行組合,MySQL 檢查是否可以使用range 或index_merge 訪問方法來索取行。
◇ Select tables optimized away:當我們使用某些聚合函數來訪問存在索引的某個字段的時候,MySQL Query Optimizer 會通過索引而直接一次定位到所需的數據行完成整個查詢。當然,前提是在Query 中不能有GROUP BY 操作。如使用MIN()或者MAX()的時候。
◇ Using filesort:當我們的Query 中包含ORDER BY 操作,而且無法利用索引完成排序操作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。
◇ Using index:所需要的數據只需要在Index 即可全部獲得而不需要再到表中取數據。
◇ Using index for group-by:數據訪問和Using index 一樣,所需數據只需要讀取索引即可,而當Query 中使用了GROUP BY 或者DISTINCT 子句的時候,如果分組字段也在索引中,Extra 中的信息就會是Using index for group-by。
◇ Using temporary:當MySQL 在某些操作中必須使用臨時表的時候,在Extra 信息中就會出現Using temporary 。主要常見于GROUP BY 和ORDER BY 等操作中。
◇ Using where:如果我們不是讀取表的所有數據,或者不是僅僅通過索引就可以獲取所有需要的數據,則會出現Using where 信息。
◇ Using where with pushed condition:這是一個僅僅在NDBCluster 存儲引擎中才會出現的信息,而且還需要通過打開Condition Pushdown 優化功能才可能會被使用??刂茀禐閑ngine_condition_pushdown 。
----摘自互聯網,進行了手工整理
轉載于:https://blog.51cto.com/xiaocao13140/2126582
總結
以上是生活随笔為你收集整理的Mysql执行计划查看的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android如何实现TCP和UDP传输
- 下一篇: linux cmake编译源码,linu