只有光頭才能變強
刷面試題的時候,不知道大家有沒有見過MySQL這兩個命令:explain
和profile
(反正我就見過了)..html
以前雖然知道這兩個命令大概什麼意思,但一直沒有去作筆記。今天發現本身的TODO LIST
有這麼兩個命令,因而打算來學習一番,記錄一下~mysql
使用的MySQL的版本爲5.6.38
git
首先咱們來體驗一下explain
命令是怎麼使用的,以及輸出的結果是什麼:github
explain select * from table_user ;
輸出結果:面試
發現很使用起來很簡單,只要explain後邊跟着SQL語句就完事了(MySQL5.6以前的版本,只容許解釋SELECT
語句,從 MySQL5.6開始,非SELECT
語句也能夠被解釋了)。sql
咱們不少時候編寫完一條SQL語句,每每想知道這條SQL語句執行是否高效。或者說,咱們創建好的索引在這條SQL語句中是否使用到了,就可使用explain
命令來分析一下!數據庫
explain
命令咱們能夠學習到該條SQL是如何執行的,隨後解析explain的結果能夠幫助咱們使用更好的索引,最終來優化它!經過explain
命令咱們能夠知道如下信息:表的讀取順序,數據讀取操做的類型,哪些索引可使用,哪些索引實際使用了,表之間的引用,每張表有多少行被優化器查詢等信息。緩存
// 好了,咱們下面看一下explain出來的結果是怎麼看的。
性能
explain命令輸出的結果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
學習
包含一組數字,表示查詢中執行SELECT子句或操做表的 順序。
在id列上也會有幾種狀況:
若是id不相同,id的序號會遞增,id值越大優先級越高,越先被執行。
表示select查詢的類型
select_type屬性下有好幾種類型:
類型有點多啊,我加粗的是最多見的,起碼要看得懂加粗的部分。
該列顯示了對應行正在訪問哪一個表(有別名就顯示別名)。
當from子句中有子查詢時,table列是 <derivenN>
格式,表示當前查詢依賴 id=N
的查詢,因而先執行 id=N
的查詢
該列稱爲 關聯類型或者訪問類型,它指明瞭MySQL決定如何查找表中符合條件的行,同時 是咱們判斷查詢是否高效的重要依據。
如下爲常見的取值
=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、IN()
的操做中,key 列顯示使用了哪一個索引,當 type 爲該值時,則輸出的 ref 列爲 NULL,而且 key_len 列是這次查詢中使用到的索引最長的那個。這一列顯示查詢 可能使用哪些索引來查找
這一列顯示MySQL 實際決定使用的索引。若是沒有選擇索引,鍵是NULL。
這一列顯示了在索引裏使用的字節數,當key列的值爲 NULL 時,則該列也是 NULL
這一列顯示了哪些字段或者常量被用來和key配合從表中查詢記錄出來。
這一列顯示了 估計要找到所需的行而要讀取的行數,這個值是個估計值,原則上值越小越好。
其餘的信息
常見的取值以下:
本來覺得Explain命令是比較難學的,但查找資料看下來,以前只是不知道具體的列和列中下的屬性是什麼意思而已。常見出現的其實也就那麼幾個,感受對着每一個屬性多看一會,仍是能夠能看懂的。
固然了,在《高性能MySQL》中也有複雜的SQL語句來分析(但我認爲咱們通常不會寫到那麼複雜)..
這篇文章也借鑑了不少其餘優秀的博客,若是你們有興趣的話能夠去閱讀一下:
EXPLAIN 命令詳解:
MySQL Explain 命令詳解:
mysql系列_explain執行計劃:
MySQL explain詳解
若是你以爲我寫得還不錯,瞭解一下:
文章的目錄導航(精美腦圖+海量視頻資源):