天天看點

MySQL邏輯架構圖分析

MySQL邏輯架構圖分析

MySQL邏輯架構圖

大體來說,MySQL 可以分為 Server 層和存儲引擎層兩部分。

Server層:

大多數MySQL的核心服務功能都在這一層,包括

連接配接器

查詢緩存

分析器

優化器

執行器

,以及所有内置函數(日期、時間、數學、加密函數等)和所有跨存儲引擎的功能(存儲過程、視圖、觸發器等),不同存儲引擎共用同一個Server層。

存儲引擎層:

存儲引擎是MySQL資料庫的核心,是底層實體結構的實作,負責MySQL中資料的存儲和提取。

MySQL資料庫差別于其它資料庫的一個最主要的特點是其基于表的插件式存儲引擎(InnoDB、MyISAM、Memory、Archive、NDB等),目前最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了預設存儲引擎。

每個存儲引擎都有它的優勢和劣勢,Server層通過API與存儲引擎層進行通信。

連接配接器

負責用戶端跟伺服器建立連接配接、身份認證(使用者名、用戶端IP、密碼是否正确 / 證書是否正确等)、權限驗證、維持和管理連接配接等操作。

查詢緩存

在MySQL查詢緩存開關開啟的前提下,MySQL會将執行過的查詢語句和結果,以key-value的形式,緩存在記憶體中的一個引用表中。

key為包含查詢語句、資料庫資訊、用戶端協定版本等影響查詢結果的資訊的哈希值,value為查詢結果。

當MySQL服務端接收到一條SQL語句時,先通過一個大小寫不敏感的檢查判斷SQL語句是否以 SEL 開頭,如果是,則檢查查詢緩存,如果命中緩存,再檢測一下使用者權限,如果權限滿足,MySQL會直接将這個value當作查詢結果傳回給用戶端,而跳過後續的分析、優化、執行等過程。

并不是所有的查詢語句和結果都會被緩存,當查詢語句中有一些不确定的資料時,則不會被緩存。例如查詢語句中包含NOW()、CURRENT_DATE、CURRENT_USER()等函數,因為每次查詢傳回的結果可能不同,是以不會被緩存。事實上,如果查詢中包含任何使用者自定義函數、存儲函數、使用者變量、臨時表、MySQL中的系統表或者任何包含列級别權限的表,則都不會被緩存。

SELECT語句沒有從查詢緩存中傳回資料的情況稱為 “緩存未命中” ,緩存未命中可能有如下幾種情況:

  • 查詢語句之前沒有被執行過,是以也未曾被緩存過;
  • 查詢語句中包含不确定的函數等,導緻無法被緩存;
  • 查詢語句對應的查詢結果太大,導緻無法被緩存;
  • 雖然之前被緩存過,但因為查詢緩存的記憶體空間耗盡,導緻某些緩存被“逐出”;
  • 資料表被修改(如執行過update語句),則導緻此表對應的所有緩存被清空;
  • 此次查詢語句跟之前執行的查詢語句有任何的字元上的不同,例如空格、注釋等不同,也會導緻緩存不命中。

查詢緩存帶來的并不都是系統性能的提升,同時也會帶來額外的消耗:

  • 每次查詢執行時,都會先檢查是否命中查詢緩存;
  • 如果一個查詢可以被緩存,并且之前還未被緩存過,則在執行完成後,會将本次查詢及結果存入查詢緩存中,這會帶來額外的系統消耗;
  • 當某個表被更新時,MySQL會将對應表的所有緩存都設定失效。如果表資料更新頻繁或者查詢緩存特别大,這個操作可能會帶來很大的系統消耗。

當查詢緩存帶來的資源節約大于其本身造成的資源消耗時才會給系統帶來性能提升。對于不經常更新的資料來說,使用緩存還是可以的。

需要注意的是,MySQL 8.0 版本直接将查詢緩存的整塊功能删掉了,也就是說 8.0 開始徹底沒有這個功能了。

分析器

分析器負責SQL語句解析和文法規則校驗等。

分析器會先做 “詞法分析” 。輸入的是由多個字元串和空格組成的一條 SQL 語句,MySQL 需要識别出裡面的字元串分别是什麼,代表什麼,如關鍵字、表名、列明等。

做完 “詞法分析” ,分析器就要做 “文法分析” 。根據詞法分析的結果,文法分析器會根據文法規則,判斷輸入的這個 SQL 語句是否滿足 MySQL 文法:

  • 是否使用了錯誤的關鍵字,如SELCT;
  • 關鍵字順序是否正确,如 FROM 在 WHERE 前邊;
  • 引号是否前後比對;
  • 資料表以及資料列是否存在;
  • 名字和别名是否有歧義;
  • 對某字段的運算是否允許,例如不能對一個整數使用 SUBSTRING() 函數。

最後還會進行權限校驗。

優化器

優化器負責将分析器生成的 “文法樹” 轉化成執行計劃。一條查詢可以有很多種執行方式,最後都會傳回相同的結果,優化器的作用就是找到其中最好的執行計劃。

MySQL的查詢優化器是一個非常複雜的部件,它使用了很多優化政策來生成一個最優的執行計劃:

  • 重新定義關聯表的順序
  • 将外連接配接轉化為内連接配接
  • 使用等價變換規則(如,where a > 100 and a > 200 會轉化為 where a > 200;where a < b and a = 5 會轉化為 where b > 5 and a = 5等)
  • 優化 COUNT()、MIN()、MAX()
  • 覆寫索引掃描(當索引中的列包含所有查詢需要使用的列的時候,MySQL就可以使用索引傳回需要的資料,而無需再查詢對應的資料行)
  • 子查詢優化
  • 提前終止查詢
  • 查詢條件中有多個索引的時候,決定使用哪個索引

執行器

執行器負責根據優化器生成的執行計劃來完成整個查詢。MySQL執行器根據執行計劃給出的指令逐漸執行,其中大量的操作需要通過調用存儲引擎實作的接口來完成。如,查詢某個索引第一行的接口、查詢某個索引條目下一條目的接口等。

小結

以上就是MySQL邏輯架構的大體介紹。掌握MySQL的邏輯架構,對于以後深入了解MySQL資料庫會有極大的幫助。

繼續閱讀