Mysql工作原理介紹
Mysql 工作原理圖
Mysql是由SQL介面,解析器,優化器,快取,儲存引擎組成的。
mysql原理圖各個元件說明:
1. connectors
與其他程式語言中的sql 語句進行互動,如php、java等。
2. Management Serveices & Utilities
系統管理和控制工具
3. Connection Pool (連線池)
管理緩衝使用者連線,執行緒處理等需要快取的需求
4. SQL Interface (SQL介面)
接受使用者的SQL命令,並且返回使用者需要查詢的結果。比如select from就是呼叫SQL Interface
5. Parser (解析器)
SQL命令傳遞到解析器的時候會被解析器驗證和解析。
主要功能:
a . 將SQL語句分解成資料結構,並將這個結構傳遞到後續步驟,後面SQL語句的傳遞和處理就是基於這個結構的
b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的,語句將不會繼續執行下去
6. Optimizer (查詢優化器)
SQL語句在查詢之前會使用查詢優化器對查詢進行優化(產生多種執行計劃,最終資料庫會選擇最優化的方案去執行,儘快返會結果) 他使用的是“選取-投影-聯接”策略進行查詢。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果.
7. Cache和Buffer (查詢快取)
如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。
這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等
8.Engine (儲存引擎)
儲存引擎是MySql中具體的與檔案打交道的子系統。也是Mysql最具有特色的一個地方。
Mysql的儲存引擎是外掛式的。它根據MySql AB公司提供的檔案訪問層的一個抽象介面來定製一種檔案訪問機制(這種訪問機制就叫儲存引擎)
SQL 語句執行過程
資料庫通常不會被直接使用,而是由其他程式語言通過SQL語句呼叫mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理
首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池(connection pool)中並由處理器(Management Serveices & Utilities)管理。當該請求從等待佇列進入到處理佇列,管理器會將該請求丟給SQL介面(SQL Interface)。SQL介面接收到請求後,它會將請求進行hash處理並與快取中的結果進行對比,如果完全匹配則通過快取直接返回處理結果;否則,需要完整的走一趟流程:
(1)由SQL介面丟給後面的直譯器(Parser),直譯器會判斷SQL語句正確與否,若正確則將其轉化為資料結構。
(2)直譯器處理完,便來到後面的優化器(Optimizer),它會產生多種執行計劃,最終資料庫會選擇最優化的方案去執行,儘快返會結果。
(3)確定最優執行計劃後,SQL語句此時便可以交由儲存引擎(Engine)處理,儲存引擎將會到後端的儲存裝置中取得相應的資料,並原路返回給程式。
注意點
(1)如何快取查詢資料
儲存引擎處理完資料,並將其返回給程式的同時,它還會將一份資料保留在快取中,以便更快速的處理下一次相同的請求。具體情況是,mysql會將查詢的語句、執行結果等進行hash,並保留在cache中,等待下次查詢。
(2)buffer與cache的區別
從mysql原理圖可以看到,快取那裡實際上有buffer和cache兩個,那它們之間的區別:簡單的說就是,buffer是寫快取,cache是讀快取。
(3)如何判斷快取中是否已快取需要的資料
這裡可能有一個誤區,覺得處理SQL語句的時候,為了判斷是否已快取查詢結果,會將整個流程走一遍,取得執行結果後再與需要的進行對比,看看是否命中,並以此說,既然不管快取中有沒有快取到查詢內容,都要整個流程走一遍,那快取的優勢在哪?
其實並不是這樣,在第一次查詢後,mysql便將查詢語句以及查詢結果進行hash處理並保留在快取中,SQL查詢到達之後,對其進行同樣的hash處理後,將兩個hash值進行對照,如果一樣,則命中,從快取中返回查詢結果;否則,需要整個流程走一遍。