1. 程式人生 > >Mysql工作原理介紹

Mysql工作原理介紹

Mysql 工作原理圖

Mysql是由SQL介面,解析器,優化器,快取,儲存引擎組成的。

 

mysql原理圖各個元件說明:

1. connectors

   與其他程式語言中的sql 語句進行互動,如phpjava等。

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 查詢先根據

where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾

這個select查詢先根據uidname進行屬性投影,而不是將屬性全部取出以後再進行過濾

將這兩個查詢條件聯接起來生成最終查詢結果.

7. CacheBuffer (查詢快取)

如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。

這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等

8.Engine (儲存引擎)

儲存引擎是MySql中具體的與檔案打交道的子系統。也是Mysql最具有特色的一個地方。

Mysql的儲存引擎是外掛式的。它根據MySql AB公司提供的檔案訪問層的一個抽象介面來定製一種檔案訪問機制(這種訪問機制就叫儲存引擎)

SQL 語句執行過程

資料庫通常不會被直接使用,而是由其他程式語言通過SQL語句呼叫mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理

   首先程式的請求會通過mysqlconnectors與其進行互動,請求到處後,會暫時存放在連線池(connection pool)中並由處理器(Management Serveices & Utilities)管理。當該請求從等待佇列進入到處理佇列,管理器會將該請求丟給SQL介面(SQL Interface)。SQL介面接收到請求後,它會將請求進行hash處理並與快取中的結果進行對比,如果完全匹配則通過快取直接返回處理結果;否則,需要完整的走一趟流程:

   (1)SQL介面丟給後面的直譯器(Parser),直譯器會判斷SQL語句正確與否,若正確則將其轉化為資料結構。

   (2)直譯器處理完,便來到後面的優化器(Optimizer),它會產生多種執行計劃,最終資料庫會選擇最優化的方案去執行,儘快返會結果。

   (3)確定最優執行計劃後,SQL語句此時便可以交由儲存引擎(Engine)處理,儲存引擎將會到後端的儲存裝置中取得相應的資料,並原路返回給程式。

注意點

(1)如何快取查詢資料

儲存引擎處理完資料,並將其返回給程式的同時,它還會將一份資料保留在快取中,以便更快速的處理下一次相同的請求。具體情況是,mysql會將查詢的語句、執行結果等進行hash,並保留在cache中,等待下次查詢。

(2)buffercache的區別

mysql原理圖可以看到,快取那裡實際上有buffercache兩個,那它們之間的區別:簡單的說就是,buffer是寫快取,cache是讀快取。

(3)如何判斷快取中是否已快取需要的資料

這裡可能有一個誤區,覺得處理SQL語句的時候,為了判斷是否已快取查詢結果,會將整個流程走一遍,取得執行結果後再與需要的進行對比,看看是否命中,並以此說,既然不管快取中有沒有快取到查詢內容,都要整個流程走一遍,那快取的優勢在哪?

其實並不是這樣,在第一次查詢後,mysql便將查詢語句以及查詢結果進行hash處理並保留在快取中,SQL查詢到達之後,對其進行同樣的hash處理後,將兩個hash值進行對照,如果一樣,則命中,從快取中返回查詢結果;否則,需要整個流程走一遍。