通過《mysql體系結構詳解》一節的介紹,大家對 mysql 的整體架構已經有了一定的了解,本節我們主要介紹資料庫的具體工作流程。下面是一張簡單的資料庫執行流程圖:
下面從資料庫架構的角度介紹資料庫的工作流程:
1. 連線層
1)連線處理:客戶端同資料庫服務層通過連線管理模組建立 tcp 連線,並請求乙個連線線程。如果連線池中有空閒的連線線程,則分配給這個連線,如果沒有,在沒有超過最大連線數的情況下,建立新的連線線程負責這個客戶端。
連線管理模組負責監聽對 mysql server 的各種請求,接收連線請求,**所有連線請求到執行緒管理模組。每乙個連線上 mysql server 的客戶端請求都會被分配(或建立)乙個連線線程為其單獨服務。而連線線程的主要工作就是負責 mysql server 與客戶端的通訊,接收客戶端的命令請求,傳遞 server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線線程。包括執行緒的建立,執行緒的快取等。
2)授權認證:在真正的操作之前,還需要呼叫使用者模組進行授權檢查,來驗證使用者是否有許可權。通過後,連線線程開始接收並處理來自客戶端的請求。
使用者模組所實現的功能,主要包括使用者的登入連線許可權控制和使用者的授權管理。它就像 mysql 的大門守衛一樣,決定是否給來訪者「開門」。
在 mysql 中,將客戶端請求分為了兩種型別:一種是 query(sql語句),需要呼叫 parser(查詢解析器)才能夠執行的請求;一種是 command(命令),不需要呼叫 parser 就可以直接執行的請求。
2. sql層
連線線程接收到 sql 語句之後,將語句交給 parser 進行語法分析和語義分析。之後根據型別的不同,有些會直接處理,有些會分發給其他模組來處理。
如果是乙個 query 型別的請求,會將控制權交給 query 解析器。
query 解析器首先分析是不是乙個 select 型別的 query。是則呼叫查詢快取模組,讓它檢查該 query 在 query cache(查詢快取)中是否已經存在,如果有結果可以直接返回給客戶端。沒有結果則將控制權交給 optimizer(查詢優化器),進行查詢的優化。
如果是表變更語句,則分別交給 insert 處理器、delete 處理器、update 處理器、create 處理器,以及 alter 處理器這些小模組來負責。
3. 儲存引擎層
在各個模組收到 query 解析或其它模組分發過來的請求後,首先會通過訪問控制模組檢查連線使用者是否有訪問目標表以及目標欄位的許可權,如果有,就會呼叫表管理模組請求相應的表,並獲取對應的鎖。
表變更管理模組主要是負責完成一些 dml 和 ddl 的 query,如:update,delete,insert,create table,alter table 等語句的處理。
當表變更管理模組「獲取」開啟的表之後,就會根據該錶的相關資訊,判斷表的儲存引擎型別和其他相關資訊。根據表的儲存引擎型別,提交請求給儲存引擎介面模組,呼叫對應的儲存引擎實現模組,進行相應處理。
不過,對於表變更管理模組來說,可見的僅是儲存引擎介面模組所提供的一系列「標準」介面,底層儲存引擎實現模組的具體實現,對於表變更管理模組來說是透明的。他只需要呼叫對應的介面,並指明表型別,之後介面模組會根據表型別呼叫正確的儲存引擎來進行相應的處理。
當一條 query 或者乙個 command 處理完成(成功或者失敗)之後,控制權都會交還給連線線程模組。
如果處理成功,則將處理結果(可能是乙個 resultset,也可能是成功或者失敗的標識)通過連線線程反饋給客戶端。
如果處理過程中發生錯誤,也會將相應的錯誤資訊傳送給客戶端,然後連線線程模組會進行相應的清理工作,並繼續等待後面的請求。之後重複上面的過程,或者與客戶端斷開連線,最後關閉連線,釋放連線線程。
mysql抓包 mysql抓包工具
簡介 mysql sniffer 是乙個基於 mysql 協議的抓包工具,實時抓取 mysqlserver 端或 client 端請求,並格式化輸出。輸出內容包括訪問時間 訪問使用者 ip 訪問 database 命令耗時 返回資料行數 執行語句等。有批量抓取多個埠,後台執行,日誌分割等多種使用方式...
mysql解析流程 mysql執行流程解析
mysql 可以分為 server 層和儲存引擎層兩部分 server 層包括聯結器 查詢快取 分析器 優化器 執行器等,涵蓋 mysql 的大多數核 心服務功能,以及所有的內建函式,所有跨儲存引 擎的功能都在這一層實現,比如儲存過程 觸發器 檢視等 而儲存引擎層負責資料的儲存和提取。其架構模式是外...
簡述MySQL安裝流程 MySQL安裝流程
若出現下圖,需要去資源管理器中把mysql程序全結束了,重新啟動即可。1.6.登入mysql 登入mysql 因為之前沒設定密碼,所以密碼為空,不用輸入密碼,直接回車即可 e mysql 5.7.20 winx64 bin mysql u root p enter password 1.7.查詢使用...