天天看點

Mysql工作原理一

Mysql邏輯架構

從mysql的原理入手,先看一張經典的圖:

Mysql工作原理一

下面是關于上圖的介紹:

1.用戶端connectors

與其他程式設計中的sql語句進行互動,如:java、php;

每個用戶端連結都會在伺服器程序中擁有一個線程,這個連接配接的查詢隻會在這個單獨的線程中執行,該線程隻能輪流在某個CPU核心或CPU中運作。伺服器會負責緩存線程,是以不需要為每一個建立的連接配接建立和銷毀線程。

一般情況,用戶端連結到mysql伺服器時,伺服器需要對其進下認證,認證基于使用者名、原始主機資訊和密碼。如果使用了安全套接字SSL的方式連接配接,一旦用戶端連接配接成功,伺服器會繼續驗證該用戶端是否具有執行某個特定查詢的權限。

2.Management Serveices & Utilities

系統管理和控制工具

3. Connection Pool (連接配接池)

管理緩存使用者連接配接,線程處理等需要緩存的需求

1、2、3——主要用于連接配接處理,授權認證,安全等,大多數基于網絡的用戶端/伺服器的工具都有類似的架構

4. SQL Interface (SQL接口)

接受使用者的SQL指令,并且傳回使用者需要查詢的結果。

(SQL接口接收到請求後,它會将請求進行hash處理并與緩存中的結果進行對比,如果完全比對則通過緩存直接傳回處理結果)

5. Parser (解析器)

SQL指令傳遞到解析器的時候,會被解析器解析和驗證

主要功能:

1.将sql分解成資料結構,并将這個結構傳遞到後續步驟,後續的sql的傳遞和處理就通過這個結構

2.後面分解過程中如果遇到了錯誤,那麼就是這個sql出現了錯誤,将不會往後繼續執行

6. Optimizer (查詢優化器)

mysql會解析查詢,并建立内部資料結構(解析樹),然後進行各種優化,比如:重寫查詢,決定表的讀取順序,選擇合适的索引等。另外使用的是“選取-投影-聯接”政策進行查詢。

用一個例子就可以了解: select uid,name from user where gender = 1;

這個select 查詢先根據where 語句進行選取,而不是先将表全部查詢出來以後再進行gender過濾

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

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

*優化器并不關心表使用的是什麼存儲引擎,但是存儲引擎對于優化查詢是有影響的,優化器會請求存儲引擎提供容量或摸個具體操作的開銷資訊,以及表資料的統計資訊(這裡我也沒太了解,照抄的)。

7. Cache和Buffer (查詢緩存)

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

這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等

*對于select語句,在解析查詢之前,伺服器會先檢查查詢緩存,如果能夠再其中找到對應的查詢,伺服器将不必再執行查詢解析、優化和執行整個過程,而直接傳回查詢緩存中的結果集。(buffer是寫緩存,cache是讀緩存)

8.Engine (存儲引擎)

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

Mysql的存儲引擎是插件式的。它根據MySql AB公司提供的檔案通路層的一個抽象接口來定制一種檔案通路機制(這種通路機制就叫存儲引擎)

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

繼續閱讀