IT修煉手冊之SQL explain
Explain
分析 SQL 的利器。
Id(重要)
SQL 查詢中,表示執行 Select 子句或者操作表的順序
Id 相同:執行順序從上到下
Id 不同:如果是子查詢,id 序號會遞增,id 越大優先順序越高,越先被執行。
Id 相同不同同時存在,滿足上面的情況。
查詢型別
SIMPLE:查詢中不包含子查詢或者 UNION
PRIMARY:若包含子查詢部分,最外層查詢則 被標記為primary;
SUBQUERY:在 SELECT 或 WHERE 列表中包含了子查詢,該子查詢被標記為:SUBQUERY
DERIVED:在 FROM 列表中包含的子查詢被標記為:DERIVED(衍生)用來表示包含在 from 子句中的子查詢的 select。mysql 會遞迴執行並將結果放到一個臨時表中。伺服器內部稱為”派生表”,因為該臨時表是從子查詢中派生出來的
UNION:若第二個 SELECT 出現在 UNION 之後,則被標記為 UNION;若 UNION 包含在 FROM子句的子查詢中,外層 SELECT 將被標記為:DERIVED UNION RESULT:從 UNION 表獲取結果的 SELECT 被標記為:UNION RESULT
Type(重要)
常見的型別以及效能最好到最次:system>const >eq_ref >ref >range>index>all。一般來說得保證查詢至少達到 range 級別,最好能到 ref 級別。
(1)、ALL:Full Table Scan, MySQL 將遍歷全表以找到匹配的行
(2)、index:Full Index Scan,index 與 ALL 區別為 index 型別只遍歷索引樹,通常比 all 快,索引檔案比資料檔案小。
(3)、range:索引範圍掃描 ,對索引的掃描開始於某一點,返回匹配值域的行。顯而易見的索引範圍掃描是帶有 between 或者 where 子句裡帶有<, >查詢。當 mysql 使用索引去查詢一系列值時,例如 IN()和 OR 列表,也會顯示 range(範圍掃描),當然效能上面是有差異的。
(4)、ref:使用非唯一索引掃描或者唯一索引的字首掃描,返回匹配某個單獨值的記錄行
(5)、eq_ref:類似 ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連線中使用 primary key 或者 unique key 作為關聯條件
(6)、 const、system:當 MySQL 對查詢某部分進行優化,並轉換為一個常量時,使用這些型別訪問。如將主鍵置於 where 列表中,MySQL 就能將該查詢轉換為一個常量。System 通常不會出現,因為表只有一行資料的時候才會出現。
possible_keys 和key(重要)
possible_keys:表示這次查詢可能會用到的索引列,一般會是一個或多個
Key:實際用到的索引列,如果為空表示沒用到索引
Key_len
顯示的值為索引欄位最大可能長度,並非實際長度,越少越好,但是越少越不精確。
Ref
顯示索引的哪一列被使用了。顯示格式:庫.表.欄位,索引型別(type).
rows(重要)
根據表統計資訊以及索引選用情況,大致估算出找到所需的記錄應該需要讀取的行數。 越少越好。
Extra(重要)
重要的額外資訊。
Using index:表示使用了覆蓋索引,不用再次去訪問資料行。存在效率高Using where: 表明使用樂 where 過濾
Using filesort 表示排序的時候沒有用到索引,使用的檔案內排序,出現這個會影響效能。Using temporary 使用了臨時表,需要建立、插入資料、刪除臨時表效能大幅度下降,常見分組和排序中
Using join buffer:改值強調了在獲取連線條件時沒有使用索引,並且需要連線緩衝區來儲存中間結果。
processlist
show processlist 獲取 sql 時的程序執行狀態,status 以下值得注意
converting HEAP to MyISAM 查詢結果太大時,把結果放在磁碟
create tmp table 建立臨時表(如 group 時儲存中間結果)
Copying to tmp table on disk 把記憶體臨時表複製到磁碟
locked 被其他查詢鎖住
logging slow query 記錄慢查詢
Profiles
show profiles 檢視一個 sql 語句執行的過程;
如果查詢第二個語句執行的過程
Mysql 架構
1.最上層是一些客戶端和連線服務,包含本地 sock 通訊和大多數基於客戶端/服務端工具實現的類似於 tcp/ip 的通訊。主要完成一些類似於連線處理、授權認證、及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於 SSL 的安全連結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。
2.第二層架構主要完成大多少的核心服務功能,如 SQL 介面,並完成快取的查詢,SQL 的分析和優化及部分內建函式的執行。所有跨儲存引擎的功能也在這一層實現,如過程、函式等。 在該層,伺服器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化如確定查詢表的順序,是否利用索引等,最後生成相應的執行操作。如果是 select 語句,伺服器還會查詢內部的快取。如果快取空間足夠大,這樣在解決大量讀操作的環境中能夠很好的提升系統的效能。
3.儲存引擎層,儲存引擎真正的負責了 MySQL 中資料的儲存和提取,伺服器通過 API 與儲存引擎進行通訊。不同的儲存引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選 取。
4.資料儲存層,主要是將資料儲存在運行於裸裝置的檔案系統之上,並完成與儲存引擎的交