1. 程式人生 > >之mysql執行計劃分析學習記錄

之mysql執行計劃分析學習記錄

extra列:
 1.const row not found --雖然使用const訪問方式讀取了資料表,但若實際資料表中沒有1條符合條件的記錄,建議先向表中儲存適當的測試資料,再檢視執行計劃.

2.distinct--表示去重
3.full scan on null key ---出現在col1 in (select col2 from ...)時,當col1為null時,就會發生全表掃描,建議在定義col1為非空或sql中加入where col1 is not null來避免。一
4.impossible having
 不存在滿足having子句條件的記錄時,會顯示impossible having,出現這個,表示sql編寫錯誤
5.impossible where --同impissible having一樣
6.impossible where noticed after reading const tables --- 讀資料表後,發現記錄不存在
7.no matching min/max row ---查詢中有mix和max,但沒有符合條件的記錄,返回空值 。
8.no matching row in const table ---以const方式訪問連線中的資料表時,不存在符合條件的記錄.
9.no tables used --不帶有from子句的查詢或from dual查詢的計劃中
10.not exists ---使用外部連線進行反連線的查詢中的extra會出現not exists
11.range checked for each record(index map:n) ---在連線兩個表的查詢中,連線條件不是常量,而兩個變數或兩個欄位,如where e2.emp_no>e1.emp_no
  index map:n中的n為16進位制,換成二進位制,對應位置為1表示備選索引在表中出現順序.
12.scanned N database ---檢視information_schema庫的資訊時,才會有
13. select tables optimizer away ---select只使用min()或max(),或者用group by訪問min或max時,若無法使用合適的索引,就會按升序或降序只讀取一個索引。
14.unique row not found--兩個表的唯一鍵(含主鍵)執行外部連線查詢,若外連線表中不存在一樣的記錄。
15.using filesort ---當沒有索引時,就會出現,先讀取數到排序快取區,排序後返回到客戶端
16 using index ---只讀取索引內容,覆蓋索引
17 using index for group-by --先用索引排序,然後再分組
18 using join buffer(block nested loop)、using join buffer(batched key access)
 讀取驅動的表的記錄放到臨時的記憶體空間(join_buffer_size)
19 using sort_union、using union、using intersect、using sort_intersect
  都是index_merge操作的四種方式
  using sort_union和using union是or操作,後兩個是and操作
  有sort的表示先排序操作
20 using temporary
  臨時表使用
21 use where ---表示mysql層進行資料加工和過濾處理
22 using where with pushed condition ---適合NDB引擎,條件下推
23 deleting all rows ---刪除所有記錄
24 FirstMatch(tbl_name)---是將in子查詢轉換成exists的優化方式,tbl_name為外部表,表示從外部表讀一條記錄,再從子查詢檢索記錄,直到匹配到記錄為止
若子查詢中一次就可找到符合條件的記錄,則執行代價非常小,若不存在任何符合條件的記錄,則執行代價變得非常高。
mairadb 10採用是materialized優化
25 loosescan(m..n)--用於in子查詢中可能產生重複記錄時
先使用using index scan訪問方法讀取子查詢內容,然後刪除重複記錄時,要使用lossescan優化方法,不需要使用臨時表。
使用方法:
  set optimizer_switch=default;
  set optimizer_switch='firstmatch=off';
  set optimizer_switch='materialization=off';
26 materialize、scan
 mysql 5.6和mariadb 10前幾個版本的extra會顯示,後期版本沒有顯示,但會在select_type中顯示materialized,顯示scan,表示不為具體化內容建立索引,走全表掃描,不顯示scan
表示為具體化的臨時表建索引,並將其用作lookup
27 start temporary、end temporary
優化子查詢
先訪問子查詢,然後將與外部查詢資料表連線後的結果儲存到臨時表,之後再刪除重複記錄。子查詢表在執行計劃中的extra顯示start temporay,外部表顯示end temporary。
28 using index condition
索引條件下推