最近在學習林曉斌(丁奇)老師的《MySQL實戰45講》,受益匪淺,做一些筆記整理一下,幫助學習。如果有小伙伴感興趣的話推薦原版課程,很不錯。 1) --基礎架構,一條SQL查詢語句如何執行 MySQL大體來說可以分為Server層和存儲引擎層兩部分. Server層包括:連接器,查詢緩存,分析器,優 ...
最近在學習林曉斌(丁奇)老師的《MySQL實戰45講》,受益匪淺,做一些筆記整理一下,幫助學習。如果有小伙伴感興趣的話推薦原版課程,很不錯。
1) --基礎架構,一條SQL查詢語句如何執行
-
MySQL大體來說可以分為Server層和存儲引擎層兩部分.
Server層包括:連接器,查詢緩存,分析器,優化器,執行器等,涵蓋MySQL的大多數核心服務功能,以及所有的內置函數(如日期,時間,數學和加密函數等),所有跨存儲引擎的功能在這一層實現,比如實現存儲過程,觸發器,視圖等。
存儲引擎層:負責數據的存儲和提取,其架構模式是插件式的,支持如InnoDB,MyISAM,Memory等多個存儲引擎,現在最常用的存儲引擎是InnoDB,它從MySQL5.5.5版本開始成為了預設存儲引擎。
- 不同的存儲引擎共用一個Server層。
- 連接器:連接器負責跟客戶端建立連接,獲取許可權,維持和管理連接。(另:如果連接器認證通過,會到許可權表裡查出連接者的許可權,之後這個連接里的操作許可權都依賴於查出許可權。也就是說如果Admin修改了某個用戶的許可權,只有當該用戶重新建立連接才會生效。)
- 查詢緩存:MySQL拿到一個查詢請求後,會先去查詢緩存中查看是否之前執行過這個條語句,如果可以找到就將結果直接返回。否則Mysql就進行後面的執行階段。(Mysql8.0版直接將查詢緩存功能刪掉了。即使是之前的版本,也不建議使用查詢緩存,因為其失效的很快。)
- 分析器:分析器會先做“詞法分析”,即從你輸入的"select"這個關鍵字識別出來這是一個查詢語句,把你輸入的字元串“ID”識別成“列ID”。之後會進行“語法分析”,判斷你輸入的sql語句是否滿足語法規則。
- 優化器:優化器是在表裡有多個索引的時候,決定使用哪個索引;或者在一個語句有多個關聯(join)的時候,決定各個表的連接順序(因此如果你要指定順序的話應在sql中顯示指明。)
- 執行器:執行器會先判斷你對要操作的表有沒有許可權,如果有就繼續執行。打開表的時候,執行器會根據表的引擎定義,去使用這個引擎提供的介面。
這個系列中每篇末尾都會有課後題,答案在下一講中公佈。因此筆者決定保留這種形式。
課後題:
如果表T中沒有欄位k,而去執行這個語句 select * from T where k = 1,那麼會報錯“Unknown column ‘k’ in ‘where clause’”。請問這個錯誤是在哪個階段報出的?
後記:
本來以為自己已經差不多弄懂了這一講的東西,直到動手寫筆記才意識有很多細節忽略了。堅持下去更新,儘快趕上我聽課的進度。