更新時間:2021-01-29 17:53:22 來源:動力節點 瀏覽1243次
MySQL中的explain命令顯示了mysql如何使用索引來處理select語句以及連接表。explain顯示的信息可以幫助選擇更好的索引和寫出更優化的查詢語句。MySQL中explain命令的使用其實很簡單,只要explain后邊跟著SQL語句就行了。例如:explain select * from tb_student;
好奇的同學可能要問了,MySQL中的explain命令有什么特別之處嗎?值得單獨拿出來講,MySQL為什么需要explain命令呢?簡單來說:通過explain命令我們可以學習到該條SQL是如何執行的,隨后解析explain的結果可以幫助我們使用更好的索引,最終來優化它。分點來說,mysql中explain命令有以下作用:
1.描述MySQL如何執行查詢操作、執行順序,使用到的索引,以及MySQL成功返回結果集需要執行的行數。
2.可以幫助我們分析 select 語句,讓我們知道查詢效率低下的原因,從而改進我們的查詢,讓查詢優化器能夠更好的工作
3.優化select 語句,分析哪些是常量表達式(例如id=1),以及分析哪些表達式可以直接轉換成常量的
4.對where條件進行簡化和轉換,如去掉無用條件,調整條件結構等
5.讀取涉及的表的統計信息,并計算分析(例如返回的行數,索引信息等),最終得出執行計劃。
相對于了解explain命令的作用,能夠讀懂explain命令輸出的結果也十分重要,explain命令的輸出結果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面我們來一一介紹每列的含義。
1.id
包含一組數字,表示查詢中執行SELECT子句或操作表的順序。
在id列上也會有幾種情況:
如果id相同執行順序由上至下。
如果id不相同,id的序號會遞增,id值越大優先級越高,越先被執行。
2.select_type
表示select查詢的類型
select_type屬性下有好幾種類型:
SIMPLLE:簡單查詢,該查詢不包含 UNION 或子查詢
PRIMARY:如果查詢包含UNION 或子查詢,則最外層的查詢被標識為PRIMARY
UNION:表示此查詢是 UNION 中的第二個或者隨后的查詢
DEPENDENT:UNION 滿足 UNION 中的第二個或者隨后的查詢,其次取決于外面的查詢
UNION RESULT:UNION 的結果
SUBQUERY:子查詢中的第一個select語句(該子查詢不在from子句中)
DEPENDENT SUBQUERY:子查詢中的 第一個 select,同時取決于外面的查詢
DERIVED:包含在from子句中子查詢(也稱為派生表)
UNCACHEABLE SUBQUERY:滿足是子查詢中的第一個 select 語句,同時意味著 select 中的某些特性阻止結果被緩存于一個 Item_cache 中
UNCACHEABLE UNION:滿足此查詢是 UNION 中的第二個或者隨后的查詢,同時意味著 select 中的某些特性阻止結果被緩存于一個 Item_cache 中
類型有點多啊,我加粗的是最常見的,起碼要看得懂加粗的部分。
3.table
該列顯示了對應行正在訪問哪個表(有別名就顯示別名)。
當from子句中有子查詢時,table列是 <derivenN>格式,表示當前查詢依賴 id=N的查詢,于是先執行 id=N 的查詢
4.type
該列稱為關聯類型或者訪問類型,它指明了MySQL決定如何查找表中符合條件的行,同時是我們判斷查詢是否高效的重要依據。
5.possible_keys
這一列顯示查詢可能使用哪些索引來查找
6.key
這一列顯示MySQL實際決定使用的索引。如果沒有選擇索引,鍵是NULL。
7.key_len
這一列顯示了在索引里使用的字節數,當key列的值為 NULL 時,則該列也是 NULL
8.ref
這一列顯示了哪些字段或者常量被用來和key配合從表中查詢記錄出來。
9.rows
這一列顯示了估計要找到所需的行而要讀取的行數,這個值是個估計值,原則上值越小越好。
10.extra
其他的信息
常見的取值如下:
Using index:使用覆蓋索引,表示查詢索引就可查到所需數據,不用掃描表數據文件,往往說明性能不錯。
Using Where:在存儲引擎檢索行后再進行過濾,使用了where從句來限制哪些行將與下一張表匹配或者是返回給用戶。
Using temporary:在查詢結果排序時會使用一個臨時表,一般出現于排序、分組和多表 join 的情況,查詢效率不高,建議優化。
Using filesort:對結果使用一個外部索引排序,而不是按索引次序從表里讀取行,一般有出現該值,都建議優化去掉,因為這樣的查詢 CPU 資源消耗大。
初次遇見MySQL中的explain命令,我們可能會覺得很復雜,無從下手,實際上我們只要掌握了上述的具體的列和列中下的屬性是什么意思,學起來也就淺顯易懂了。想要學習MySQL的更多知識,就到本站的MySQL教程,名師講解,內容豐富的資料,助你學有所成!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習