MySQL命令執行過程原始碼相關模組
阿新 • • 發佈:2019-01-05
參照 http://rrdba.cn/?p=35 畫了如下的圖,對MySQL sql命令的執行進行解讀。
初步瞭解,肯定有很多錯誤。
1.使用者在發出sql命令之後,mysql的執行緒管理器會建立或者重用一個執行緒,建立client到mysql伺服器的連線。mysql會根據使用者名稱和使用者IP(或主機名),在mysql.user表中檢視是否有記錄,是否允許連線。
2.使用者認證完成之後,會進入commander dispatcher模組(命令分發),同時會呼叫Logging Module記錄常規日誌(所以常規日誌中記錄的是mysql執行的所有命令,包括一些使用者輸入錯誤或者執行失敗的命令,謹慎開啟,在業務忙時,會增長迅速,可用於出現故障時進行故障復現時使用。)
3.在解析命令之前,會呼叫query cache module,根據SQL 的hash值,檢查查詢快取中是否有該sql的結果集快取。
根據SQL的hash值查詢(跟oracle類似,都是用hash值)。MySQL的結果集快取並不只能,在表中資料被修改時,無法判斷與該表有關的結果集快取是否失效,所以MySQL對於結果集快取的處理比較粗暴,只要表中的資料被修改了,則該表在結果集中的快取全部失效。
4.MySQL將SQL解析之後,根據SQL型別不同,呼叫不同的模組進行處理,如查詢優化,修改,複製,統計,表的維護等模組。
5.解析並處理SQL之後,驗證使用者許可權,是否有足夠的許可權執行該操作。(為什麼不在使用者認證階段就進行許可權驗證呢?不明白)
6.最後根據提供的介面,呼叫不同表對應的不同儲存引擎的具體實現。