通過《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索引執行計畫 MySQL索引及執行計畫
mysql索引及執行計畫 索引合理的建立索引可以加快資料查詢,例如,學校圖書管為每一本書編號,根據編號可以快速鎖定一本書所在位置。mysql索引預設b 樹索引。索引雖然能夠提高檢索效率,但同時也會降低更新的速度,因為insert update delete也會操作索引檔案,會調整因為更新等操作帶來的...
MySQL語法執行工作原理
目錄 二 從mysql語法執行原理談效能測試 三 資料庫伺服器快取配置策略 四 各資料庫集群部署方式 客戶端請求由nginx等負載均衡伺服器轉交給tomcat,tomcat從mysql中撈取資料,如果請求的資料在mysql快取中,那麼mysql會將快取中撈取到的資料返回給客戶端,如果快取中沒有請求的...