MySQL源代碼的海洋中游弋 初探MySQL之SQL執(zhí)行過程
五月 15, 2012
?by?
admin
?·?
?
導(dǎo)讀:
???????? 2012年5月12日,MySQL技術(shù)群-北京技術(shù)圈的MySQL愛好者,聚集搜狐公司,舉辦MySQL數(shù)據(jù)庫技術(shù)沙龍,本文內(nèi)容為搜狐DBA團隊古雷(外號:古大師,因研究佛學(xué)而來)分享的MySQL之SQL執(zhí)行過程,先整理成文章的方式供大家閱讀,古大師也是mysqlops中文網(wǎng)的技術(shù)編輯之一。
?
序言:
?不積跬步,無以至千里;不積小流,無以成江?!秳駥W(xué)》荀子
?吾生也有涯,而知也無涯。以有涯隨無涯,殆已——《養(yǎng)生主》莊子
?
Group by
?select name1 from test group by name1;
?從InnoDB存儲引擎表讀出一條記錄,寫入臨時表,循環(huán)往復(fù)
?臨時表中,group by的key(本例中為name1)
–每個KEY值只有一行記錄
–(相同KEY值寫入,檢測到重復(fù)鍵錯誤,忽略此錯誤并繼續(xù))
?從臨時表中讀取記錄(全部或KEY)
?排序(filesort)
?發(fā)送排序結(jié)果
?
?
Group by + sum
?select sum(id) from test group by name1;
?從InnoDB存儲引擎表讀取一條記錄,寫入臨時表,循環(huán)往復(fù)
?臨時表中g(shù)roup by的key(本例中為name1)
–有一個hash索引
–每個KEY值只有一行記錄
–寫入臨時表每行記錄時,更新相同KEY的sum值
?以group by的key對臨時表排序(filesort)
?發(fā)送排序結(jié)果
?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值,把結(jié)果發(fā)送給客戶端,再繼續(xù)從索引讀以下記錄。
?
什么是Nested Loop Join(嵌套循環(huán)算法)
?
DEPENDENT SUBQUERY
?
DERIVED(派生表)
?
兩表JOIN + ORDER BY
?循環(huán)讀取ttt表的記錄,寫入cache,直至都寫完
?循環(huán)從tttt表中讀取記錄
?每讀一條,再循環(huán)讀取cache中記錄,并做比較
?滿足條件的記錄寫入臨時表
?對臨時表排序
?發(fā)送結(jié)果
?
?Using join buffer是循環(huán)讀取big表并與join buffer中的保存的table2記錄比較
?Using temporary是保存匹配的記錄,然后需要排序
?
?
總結(jié)
?之前看手冊上的諸多概念,有空中樓閣的感覺
?通過跟蹤源碼,則逐漸有腳踏實地的感覺
?希望真正看懂explain的輸出
?
轉(zhuǎn)自:
http://www.mysqlops.com/2012/05/15/mysql-sql-analyze.html
MySQL源代碼的海洋中游弋 初探MySQL之SQL執(zhí)行過程