MySQL源代碼的海洋中游弋 初探MySQL之SQL執行過程
五月 15, 2012
?by?
admin
?·?
?
導讀:
???????? 2012年5月12日,MySQL技術群-北京技術圈的MySQL愛好者,聚集搜狐公司,舉辦MySQL數據庫技術沙龍,本文內容為搜狐DBA團隊古雷(外號:古大師,因研究佛學而來)分享的MySQL之SQL執行過程,先整理成文章的方式供大家閱讀,古大師也是mysqlops中文網的技術編輯之一。
?
序言:
?不積跬步,無以至千里;不積小流,無以成江?!秳駥W》荀子
?吾生也有涯,而知也無涯。以有涯隨無涯,殆已——《養生主》莊子
?
Group by
?select name1 from test group by name1;
?從InnoDB存儲引擎表讀出一條記錄,寫入臨時表,循環往復
?臨時表中,group by的key(本例中為name1)
–每個KEY值只有一行記錄
–(相同KEY值寫入,檢測到重復鍵錯誤,忽略此錯誤并繼續)
?從臨時表中讀取記錄(全部或KEY)
?排序(filesort)
?發送排序結果
?
?
Group by + sum
?select sum(id) from test group by name1;
?從InnoDB存儲引擎表讀取一條記錄,寫入臨時表,循環往復
?臨時表中group by的key(本例中為name1)
–有一個hash索引
–每個KEY值只有一行記錄
–寫入臨時表每行記錄時,更新相同KEY的sum值
?以group by的key對臨時表排序(filesort)
?發送排序結果
?If you use GROUP BY, output rows are sorted according to the GROUP BY columns as if you had an ORDER BY for the same columns. To avoid the overhead of sorting that GROUP BY produces, add ORDER BY NULL
?
臨時表寫入的痕跡1
?
?
group by使用索引時,不需要臨時表
?從索引中讀取記錄,計算count,由于索引是按照group by的key排序的,因此可以邊讀記錄邊計算當前key的count,當讀的key值要變化時,則剛剛計算的count值就是那個key的最終count值,把結果發送給客戶端,再繼續從索引讀以下記錄。
?
什么是Nested Loop Join(嵌套循環算法)
?
DEPENDENT SUBQUERY
?
DERIVED(派生表)
?
兩表JOIN + ORDER BY
?循環讀取ttt表的記錄,寫入cache,直至都寫完
?循環從tttt表中讀取記錄
?每讀一條,再循環讀取cache中記錄,并做比較
?滿足條件的記錄寫入臨時表
?對臨時表排序
?發送結果
?
?Using join buffer是循環讀取big表并與join buffer中的保存的table2記錄比較
?Using temporary是保存匹配的記錄,然后需要排序
?
?
總結
?之前看手冊上的諸多概念,有空中樓閣的感覺
?通過跟蹤源碼,則逐漸有腳踏實地的感覺
?希望真正看懂explain的輸出
?
轉自:
http://www.mysqlops.com/2012/05/15/mysql-sql-analyze.html
MySQL源代碼的海洋中游弋 初探MySQL之SQL執行過程