mysql邏輯架構連線池 MySQL 邏輯架構

2021-10-19 00:25:15 字數 3334 閱讀 6094

1.mysql整體邏輯架構

mysql 資料庫的邏輯架構如下圖:

第二層值得關注。這是mysql的核心部分。通常叫做 sql layer。在 mysql據庫系統處理底層資料之前的所有工作都是在這一層完成的,包括許可權判斷, sql解析,行計畫優化, query cache 的處理以及所有內建的函式(如日期,時間,數**算,加密)等等。各個儲存引擎提供的功能都集中在這一層,如儲存過程,觸發器,視 圖等。

第三層包括了儲存引擎。通常叫做storengine layer ,也就是底層資料訪問操作實現部分,由多種儲存引擎共同組成。它們負責儲存和獲取所有儲存在mysql中的資料。就像linux眾多的檔案系統 一樣。每個儲存引擎都有自己的優點和缺陷。伺服器是通過儲存引擎api來與它們互動的。這個介面隱藏 了各個儲存引擎不同的地方。對於查詢層盡可能的透明。這個api包含了很多底層的操作。如開始乙個事 物,或者取出有特定主鍵的行。儲存引擎不能解析sql,互相之間也不能通訊。僅僅是簡單的響應伺服器 的請求。

連線管理和安全

在伺服器內部,每個client連線都有自己的執行緒。這個連線的查詢都在乙個單獨的執行緒中執行。這些執行緒輪流執行在某乙個cpu核心(多核cpu)或者cpu中。伺服器快取了執行緒,因此不需要為每個client連線單獨建立和銷毀執行緒 。

當clients(也就是應用程式)連線到了mysql伺服器。伺服器需要對它進行認證(authenticate)。認證是基於使用者名稱,主機,以及密碼。對於使用了ssl(安全套接字層)的連線,還使用了x.509證書。clients一連線上,伺服器就驗證它的許可權 (如是否允許客戶端可以查詢world資料庫下的country表的資料)。

優化和執行

優化器並是不關心表使用了哪種儲存引擎,但是儲存引擎對伺服器優化查詢的方式是有影響的。優化器需要知道儲存引擎的一些特性:具體操作的效能和開銷方面的資訊,以及表內資料的統計資訊。例如,儲存引擎支援哪些索引型別,這對於查詢是非常有用的。

在解析查詢之前,要查詢快取,這個快取只能儲存查詢資訊以及結果資料。如果請求乙個查詢在快取 中存在,就不需要解析,優化和執行查詢了。直接返回快取中所存放的這個查詢的結果。

2.mysql邏輯模組組成

雖然從上圖1看起來 mysql 架構非常的簡單,就是簡單的兩部分而已,但實際上每一層 中都含有各自的很多小模組,尤其是第二層 sql layer ,結構相當複雜的。下面我們就分別 針對 sql layer 和 storage engine layer 做乙個簡單的分析。我們看下圖體系結構:

指的是不同語言中與sql的互動

2 management serveices & utilities:

系統管理和控制工具

3 connection pool: 連線池

管理緩衝使用者連線,執行緒處理等需要快取的需求。

負責監聽對 mysql server 的各種請求,接收連線請求,**所有連線請求到執行緒管理模組。每乙個連線上 mysql server 的客戶端請求都會被分配(或建立)乙個連線線程為其單獨服務。而連線線程的主要工作就是負責 mysql server 與客戶端的通訊,

接受客戶端的命令請求,傳遞 server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線線程。包括執行緒的建立,執行緒的 cache 等。

4 sql inte***ce: sql介面。

接受使用者的sql命令,並且返回使用者需要查詢的結果。比如select from就是呼叫sql inte***ce

5 parser: 解析器。

sql命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由lex和yacc實現的,是乙個很長的指令碼。

在 mysql中我們習慣將所有 client 端傳送給 server 端的命令都稱為 query ,在 mysql server 裡面,連線線程接收到客戶端的乙個 query 後,會直接將該 query 傳遞給專門負責將各種 query 進行分類然後**給各個對應的處理模組。

主要功能:

a . 將sql語句進行語義和語法的分析,分解成資料結構,然後按照不同的操作型別進行分類,然後做出針對性的**到後續步驟,以後sql語句的傳遞和處理就是基於這個結構的。

b.  如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的

6 optimizer: 查詢優化器。

sql語句在查詢之前會使用查詢優化器對查詢進行優化。就是優化客戶端請求的 query(sql語句) ,根據客戶端請求的 query 語句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出乙個最優的策略,告訴後面的程式如何取得這個 query 語句的結果

他使用的是「選取-投影-聯接」策略進行查詢。

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

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

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

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

7 cache和buffer: 查詢快取。

他的主要功能是將客戶端提交 給mysql 的 select 類 query 請求的返回結果集 cache 到記憶體中,與該 query 的乙個 hash 值 做

乙個對應。該 query 所取資料的基表發生任何資料的變化之後, mysql 會自動使該 query 的cache 失效。在讀寫比例非常高的應用系統中, query cache 對效能的提高是非常顯著的。當然它對記憶體的消耗也是非常大的。

如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等

8 、儲存引擎介面

儲存引擎介面模組可以說是 mysql 資料庫中最有特色的一點了。目前各種資料庫產品中,基本上只有 mysql 可以實現其底層資料儲存引擎的外掛程式式管理。這個模組實際上只是 乙個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天 mysql 可插拔儲存引擎的特色。

從圖2還可以看出,mysql區別於其他資料庫的最重要的特點就是其外掛程式式的表儲存引擎。mysql外掛程式式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如sql分析器和優化器等,而儲存引擎是底層物理結構的實現,每個儲存引擎開發者都可以按照自己的意願來進行開發。

注意:儲存引擎是基於表的,而不是資料庫。

mysql連線池 順序 Mysql 連線池

通常,如果我們的服務涉及到mysql的操作,當乙個新的請求進來的時候,可以先連線mysql,使用完之後再斷開連線即可。但這樣做有個弊端,當請求量巨大時,會在瞬間有大量的資料庫連線與斷開操作,這是非常影響 mysql 效能的做法。此時,我們就需要使用mysql連線池。在 python 服務中使用 my...

mysql連線池的概念 連線池概念

1 連線池是乙個程序 多個連線是在乙個程序裡面儲存 管理的。這個程序儲存所有的連線,當我們開啟連線,如果有未用連線可用,則返回該連線。如果池中的連線都用完了,則建立乙個新的連線儲存到連線池。而但我們關閉連線的時候,連線池裡面並不關閉連線,而是返回連線池中並標記為可重用的狀態,等待重新連線直到等待超時...

七 mysql連線池

資料儲存到資料庫中,當然少不了獲取連線及執行sql 使用連線池,獲取連線 classmethod defgetconnection cls return 返回乙個資料庫連線的例項 logger logging.getlogger mylogger.myutil.myutil try if myuti...