mysql之SQL執行計劃分析EXPLAIN

開始想理理我學會的關於mysql的使用,當發現一個sql執行比較慢的時候,而後就要分析這條sql的執行計劃是怎麼樣的,包括表如何鏈接和鏈接的順序,那麼在mysql中explain就派上用場了,而後能夠寫出更加優化的sql,添加合適的索引,固然執行計劃不是一層不變的,會根據數據庫的實際狀況改變。mysql

這邊使用的是MariaDB數據庫,MariaDB是目前最受關注的MySQL數據庫衍生版,也被視爲開源數據庫MySQL的替代品,但它在擴展功能、存儲引擎以及一些新的功能改進方面都強過MySQL。sql

由於我這這邊就建了一張表,其實多表關聯也是相似的,幾張表就幾行。數據庫

id:這邊的id是執行順序,我也見過上下能夠是同樣的,我猜是同時執行的意思吧。session

select_type:有simple(簡單表,既不使用錶鏈接或者子查詢),primary(主查詢,即外層查詢),union(union中第二個或者後面的查詢語句),subquery(子查詢中的第一個select)等。優化

table:結果集的表名。排序

type:查詢訪問方式,type=all(遍歷全表匹配查找,出現這個就比較尷尬了);type=index(索引全掃描);type=range(索引範圍掃描)常見於比較符號;type=ref(使用非惟一索引掃描或者惟一索引的前綴掃描);type=eq_ref(使用了惟一索引,多見於多表惟一索引關聯);type=const/system(單表中最多有一個匹配行,根據主鍵或者惟一索引);type=NULL(不用訪問表或者索引,直接能夠獲得結果)等。索引

possible_keys :表示查詢可能使用的索引。io

key:表示實際使用的索引。table

key_len:使用索引字段的長度。擴展

rows:掃描行的數量。

Extra:對執行計劃比較重要的狀況的說明和描述。Using temporary是使用了臨時表,Using filesort:MYSQL須要進行額外的步驟來返回的行排序,這兩種都是須要優化的,還有其餘的。
 

在mysql5.0.37開始支持對show profile的支持分析sql,使用select @@have_profiling看數據庫是否支持

默認狀況下,profiling是關閉的

能夠經過set語句在session級別開啓 set profiling=1

而後我執行一個比較耗時的操做

經過show profiles查看執行query_id

而後show profile for query語句能夠看到執行過程當中每一個狀態和消耗的時間。

能夠看到上面的這個操做時間都花在了Sending date狀態上。

 

週六是個好日子,陽光也正好!

相關文章
相關標籤/搜索