初步理解MySQL(5.6)的執行計劃

jopen 11年前發布 | 15K 次閱讀 MySQL 數據庫服務器

聲明:以下均來自于MySQL英文手冊5.6。

1.MySQL所有的join都是使用 nest-loop join 算法(嵌套循環算法)。

2.對于一組joins,MySQL的join算法會從第一個表讀取一行,然后一直往后逐個表找匹配行,如果某一行能夠從第一個表開始,之后每個表 都能找到匹配的行,則輸出該“大行”;然后原路返回到之前的表直到能找到一張中包含匹配行的表為止,然后繼續向后面的每個表找匹配的行。

3.MySQL中索引的使用會被索引的cardinality所影響,cardinality就是基數,集合的勢的意思,太低會導致索引被棄用,舉 個例子,如果向sex這種取值太單一的字段建立索引,該索引可能不會被使用,因為基數太小了。可以通過Analyze Table tbl_name,來分析表,更新表的統計數據(InnoDB,MyISAM一般會自動更新)。

4.

執行計劃中各列的解釋:

列名
解釋
特殊說明
id select的標識符 select在查詢中的序號,同序號就表明是一組,序號的組越大越先執行,越外層數值越小,如果是union結果則是NULL,同組的話按照從上到下的順序執行。
select_type select類型 沒有子查詢或union時都是simple,否則會有primary和union之類的,這里要注意帶有uncacheable的類型,表示無法緩存,外層行切換會導致重新計算該select
table 輸出行的所屬表 表名或<unionM,N>,<derivedN>,<subqueryN>
partitions 匹配的分區 涉及到表的分區
type join類型 第5點有詳細說明
possible_keys 可能被選擇的索引 用于查找行的索引,獨立于執行順序的,這意味著不一定會使用,只是可能
key 實際被選擇的索引 可能會出現不在possible_keys的的key的情況,就是如果索引覆蓋了被選擇的列,即便該索引不能用于查找行,但也會使掃描更快,因此MySQL也會使用
key_len 被選擇的鍵的長度 MySQL在多部分索引中使用的部分的長度,可能有多個值
ref 需要與索引比較的列 列或者常數
rows 估計要被檢驗的行數 InnoDB中不一定精確,只是一個估計值
filtered 被表的條件所過濾的行的百分比 估計
Extra 額外信息 內容太多,需要再查文檔吧

5.type(join的類型):

system(表只有一行),

const(表最多只有一行匹配),

eq_ref(每次與之前的表合并行都只在該表讀取一行,這是除了system,const之外最好的一種,特點是使用=,而且索引的所有部分都參與join且索引是主鍵或非空唯一鍵的索引),

ref(如果每次只匹配少數行,那就是比較好的一種,使用=或<=>,可以是左覆蓋索引或非主鍵或非唯一鍵),

fulltext(全文搜索),

ref_or_null(與ref類似,但包括NULL),

index_merge(表示出現了索引合并優化,這個比較復雜,目前的理解是合并單表的范圍索引掃描),

unique_subquery(把形如“select primary_key”的子查詢替換),

index_subquery(把形如”select key_column“的子查詢替換),

range(常數范圍),

index(一種情況是索引覆蓋的全表掃描,只需查索引(3中表格所指出的key的特例),另一種是),

all(全表掃描)。

6.評估查詢性能可以通過計算磁盤尋址次數:

小表一般一次尋址可以讀取一行,因為索引可能被緩存,

大表則可以通過下列公式:log(row_count) /log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) +1。

如果是寫入的話,通常需要四次尋址,其中一次尋址是尋找插入新索引的地方,通常更新索引需要兩次(B樹插入新節點后調整的平均次數是兩次?Why?統計學原理?),最后一次寫入該行。

7.SELECT @@optimizer_switch;或show variables like 'optimizer_switch';可以查看優化器的一些選項。

8.什么是執行計劃:

The set of operations that the optimizer chooses to perform the most efficient query is called the “query execution plan”, also known as the EXPLAIN plan。

優化器為了最有效的執行查詢而選擇的一系列操作被稱為執行計劃。

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!