SQL執行計劃分析
執行計劃分析在sql調優中占有舉足輕重的地位,通過Explain+我們自定義的SQL便可得出該SQL的執行計劃,如下:


我們來分析一下執行計劃中比較重要的幾列:
id列
它是select的序列號,有幾個select就有幾個id,并且id的順序是按select出現的順序增長的。
id列越大執行優先級越高,id相同則從上往下執行,id為NULL最后執行。
table列
即對應select的那個表。
type列
這一列表示SQL的優化程度,依次從最優到最差分別為:system>const>eq_ref>ref>range>index>ALL。一般來說,得保證查詢達到range級別,最好達到ref。
key列
實際走的索引。
rows列
mysql內部估算的結果數或掃描數。
Extra列
這一列展示一些額外信息,重要的信息有以下幾個:
1)Usingindex:表示使用了覆蓋索引(覆蓋索引的意思就是只查詢索引樹上的字段,減少了回表操作,從而提升了速度);
2)Usingwhere:使用where語句來處理結果,并且查詢的列未被索引覆蓋;
3)Usingindexcondition:查詢的列不完全被索引覆蓋,where條件中是一個前導列的范圍;
4)Usingtemporary:mysql需要創建一張臨時表來處理查詢。出現這種情況一般是要進行優化的,首先是想到用索引來優化;
5)Usingfilesort:使用普通字段排序而不是索引排序,數據較小時從內存排序,否則需要在磁盤完成排序。這種情況下一般也是要考慮使用索引來優化的。
SQL在MYSQL中如何執行
要弄懂這個問題,首先我們要搞清楚MYSQL的內部結構,如下:


SQL執行過程如下:
MYSQL作為服務端,我們的程序作為客戶端通過TCP與MYSQL保持一個長連接。
MYSQL把我們的SQL作為一個key去緩存中查詢(MYSQL的緩存采用的是LRU淘汰算法來實現緩存的淘汰機制的),判斷是否緩存命中。
如命中,則直接返回數據;如未命中,則繼續下面的流程。
MYSQL實現了一套語法分析器(C語言寫的),通過這個分析器來判斷我們SQL語法的正確性。
語法正確之后,再通過內部實現的優化器對我們的SQL進行一些優化,包括成本Cost計算等等(這就是為什么我們覺得某個SQL理論上會走索引,但是執行計劃顯示卻沒有走索引的原因),最終生成我們SQL的執行計劃。
當然,我們也可以通過FORCE_INDEX(….)強制走索引。
優化完成之后,會進入MYSQL內部的執行器,然后通過執行器調用我們這張表對應的存儲引擎,比如Innodb、 MyISAM、Memory等等。
執行引擎會根據優化器分析出來的結果,也就是通過最優索引去對應的索引樹上找到對應的數據,同時進行索引樹的維護。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。