開始想理理我學會的關於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狀態上。
週六是個好日子,陽光也正好!