MySQL-體系結構

體系結構

網絡連接層

最上層是一些客戶端和鏈接服務,包含本地socket通信和大多數基于客戶端/服務端工具實現(xiàn)的類似于TCP/IP的通信。主要完成一些類似于連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現(xiàn)基于SSL的安全鏈接。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。

  • Client Connectors:客戶端連接器
    提供與 MySQL 服務器建立的支持。目前幾乎支持所有主流的服務端編程技術,如 Java、C、Python、.Net等,它們通過各自 API 技術與 MySQL 建立連接
服務層

第二層架構主要完成大多數的核心服務功能,如SQL接口,并完成緩存的查詢,SQL的分析和優(yōu)化,部分內置函數的執(zhí)行。所有跨存儲引擎的功能也在這一層實現(xiàn),如過程、函數等。在該層,服務器會解析查詢并創(chuàng)建相應的內部解析樹,并對其完成相應的優(yōu)化如確定表的查詢順序,是否利用索引等,最后生成相應的執(zhí)行操作。如果是select語句,服務器還會查詢內部的緩存,如果緩存空間足夠大,這樣在解決大量讀操作的環(huán)境中能夠很好的提升系統(tǒng)的性能。

  • Connection Pool:連接池組件
    負責存儲和管理客戶端與數據庫的連接,一個線程負責管理一個連接
  • Management Service & Utilities:管理服務和工具組件
    例如備份恢復、安全管理、集群管理等
  • SQL Interface:SQL接口組件
    用于接受客戶端發(fā)送的各種 SQL 命令,并且返回用戶需要查詢的結果。比如DML、DDL、存儲過程、視圖、觸發(fā)器等。
  • Parser:查詢分析器組件
    負責將請求的 SQL 解析生成一個“解析樹”,然后根據一些 MySQL 規(guī)則進一步檢查解析樹是否合法
  • Optimizer:優(yōu)化器組件
    當“解析樹”通過解析器語法檢查后,將交由優(yōu)化器將其轉化成執(zhí)行計劃,然后與存儲引擎交互
  • Caches & Buffers:緩存組件
    緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,權限緩存,引擎緩存等。如果查詢緩存有命中的查詢結構,查詢語句就可以直接去查詢緩存中取數據
引擎層

存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API和存儲引擎進行通信。不同的存儲引擎具有不同的功能,這樣我們可以根據自己的需要,來選取合適的存儲引擎。

  • Pluggable Storage Engines:存儲引擎
    存儲引擎負責 MySQL中數據的存儲和提取,與底層文件文件進行交互。MySQL 存儲引擎是插件式的,服務器中的查詢執(zhí)行引擎通過接口與存儲引擎進行通信,接口屏蔽了不同存儲引擎之間的差異。
存儲層

數據存儲層,主要是將數據存儲在文件系統(tǒng)之上,并完成與存儲引擎的交互。

  • File System:文件系統(tǒng)
    負責將數據庫的數據和日志存儲在文件系統(tǒng)之上,并完成與存儲引擎的交互,是文件的物理存儲層。主要包括日志文件、數據文件、配置文件、pid文件、socket文件等

tips: 和其他數據庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用并發(fā)揮良好作用。主要體現(xiàn)在存儲引擎上,插件式的存儲引擎架構,將查詢處理和其他的系統(tǒng)任務以及數據的存儲提取分離。這種架構可以根據業(yè)務的需求和實際需要選擇合適的存儲引擎。

運行機制

  • 建立連接(Connectors&Connection Pool)
    通過客戶端/服務器通信協(xié)議與 MySQL 建立連接。MySQL 客戶端與服務器的通信方式是“半雙工[1]”。對于每一個 MySQL 的連接,時刻都有一個線程狀態(tài)來標識這個連接正在做什么
show processlist;  // 查看用戶正在運行的線程信息
?id:線程ID
?user:啟動這個線程的用戶
?Host:發(fā)送請求的客戶端的IP和端口號
?db:當前命令在哪個庫執(zhí)行
?Command:該線程正在執(zhí)行的操作命令
  ?Create DB:正在創(chuàng)建庫操作
  ?Drop DB:正在刪除操作
  ?Execute:正在執(zhí)行一個PreparedStatement
  ?Close Stmt:正在關閉一個 PreparedStatement
  ?Query:正在執(zhí)行一個語句
  ?Sleep:正在等待客戶端發(fā)送語句
  ?Quit:正在退出
  ?Shutdown:正在關閉服務器
?Time:表示該線程處于當前狀態(tài)的時間,單位秒
?State:線程狀態(tài)
  ?Updating:正在搜索匹配記錄,進行修改
  ?Sleeping:正在等待客戶端發(fā)送新請求
  ?Starting:正在執(zhí)行請求處理
  ?Checking table:正在檢查數據表
  ?Closing table:正在將表中數據刷新到磁盤中
  ?Locked:被其他查詢鎖住了記錄
  ?Sending Data:只在處理SELECT查詢,同時將結果發(fā)送給客戶端
?Info:一般記錄線程執(zhí)行的語句,默認顯示前100個字符,想查看完整的使用 show full processlist
  • 查詢緩存(Cache&Buffer)
    MySQL 的一個可優(yōu)化查詢的地方,如果開啟了查詢緩存且在查詢緩存過程中查詢到完全相同的 SQL 語句,則將查詢結果直接返回給客戶端;否則會由解析器進行語法語義解析,并生成“解析樹”
  • 解析器(Parser)
    將客戶端發(fā)送的 SQL 進行語法解析,生成“解析樹”。預處理器根據一些 MySQL 規(guī)則進一步檢查“解析樹”是否合法,例如檢查數據表和數據列是否存在,還會解析名字和別名,看看它們是否有歧義,最后生成新的“解析樹”
  • 查詢優(yōu)化器(Optimizer)
    根據“解析樹”生成最優(yōu)的執(zhí)行計劃。MySQL 使用了很多優(yōu)化策略生成最優(yōu)的執(zhí)行計劃,可以分為兩類:靜態(tài)優(yōu)化(編譯時優(yōu)化)、動態(tài)優(yōu)化(運行時優(yōu)化)
    • 等價變換策略
      5=5 and a > 5 ==> a > 5
      a < b and a = 5 ==> b > 5 and a = 5
      基于聯(lián)合索引,調整條件位置等
    • 優(yōu)化 count、min、max等函數
      InnoDB引擎 min 函數只需要找索引最左邊
      InnoDB引擎 max 函數只需要找索引最右邊
      MyISAM引擎 count(*) 不需要計算直接返回
    • 提前終止查詢
      使用了 limit 查詢,獲取 limit 所需的數據,就不在繼續(xù)遍歷后面數據
    • in的優(yōu)化
      MySQL 對 in 查詢,會先進行排序,再采用二分法查找數據。比如where id in (2, 1, 3),變成 in (1, 2, 3)
  • 查詢執(zhí)行引擎
    負責執(zhí)行 SQL 語句,此時查詢執(zhí)行引擎會根據 SQL 語句中表的存儲引擎類型,以及對應的 API 接口與底層存儲引擎緩存或物理文件的交互,得到查詢結構并返回給客戶端。若開啟查詢緩存,會將 SQL 語句和結果完整地保存到查詢緩存中

  1. 通訊機制:
    全雙工: 能同時發(fā)送和接收數據,例如平時打電話
    半雙工:指的某一時刻,要么發(fā)送數據,要么接收數據,不能同時。例如早期對講機
    單工:只能發(fā)送數據或只能接收數據。例如單行道 ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容