MySQL 學習筆記 架構

2021-06-29 04:29:04 字數 2265 閱讀 7559

1、mysql伺服器邏輯架構圖:

第一層:該服務並不是mysql所獨有的,大多數基於網路的客戶端/伺服器的工具或者服務都有的類似的架構。比如連線處理、授權認證、安全等等。

第二層:mysql的核心服務功能,包括查詢解析、分析、優化、快取以及所有的內建函式(日期、時間、加密),所有跨存引擎的功能都在這裡實現:儲存過程、觸發器、檢視等。

第三層:bdb(頁級)、myisam(表級:可讀不可寫)、innodb(行級)等等引擎。

2、多版本併發控制mvcc

大多數事務型儲存引擎實現的都不是簡單的行級鎖。基於提公升併發性的考慮,它們一般都同時實現了多版本併發控制mvcc。不公是mysql,包括oracle、postgresql等其他資料系統也都實現了mvcc,但各自的實現機制不盡相同。因為mvcc沒有乙個統一的實現標準。可以認為mvcc是乙個行級鎖的變種。

在mysql中mvcc是在innodb儲存引擎中得到支援的,innodb為每行記錄都實現了三個隱藏字段:

6位元組的事物id用來標識該行所述的事務,7位元組的回滾指標需要了解下innodb的事務模型。

為了支援事務,innbodb引入了下面幾個概念:

下面演示下事務對某行記錄的更新過程:

2.1. 初始資料行

f1~f6是某行列的名字,1~6是其對應的資料。後面三個隱含字段分別對應該行的事務號和回滾指標,假如這條資料是剛insert的,可以認為id為1,其他兩個欄位為空。

2.2.事務1更改該行的各字段的值

當事務1更改該行的值時,會進行如下操作:

2.3.事務2修改該行的值

與事務1相同,此時undo log,中有有兩行記錄,並且通過回滾指標連在一起。

因此,如果undo log一直不刪除,則會通過當前記錄的回滾指標回溯到該行建立時的初始內容,所幸的時在innodb中存在purge執行緒,它會查詢那些比現在最老的活動事務還早的undo log,並刪除它們,從而保證undo log檔案不至於無限增長。

2.4. 事務提交

當事務正常提交時innbod只需要更改事務狀態為commit即可,不需做其他額外的工作,而rollback則稍微複雜點,需要根據當前回滾指標從undo log中找出事務修改前的版本,並恢復。如果事務影響的行非常多,回滾則可能會變的效率不高,根據經驗值沒事務行數在1000~10000之間,innodb效率還是非常高的。很顯然,innodb是乙個commit效率比rollback高的儲存引擎。據說,postgress的實現恰好與此相反。

2.5. insert undo log

上述過程確切地說是描述了update的事務過程,其實undo log分insert和update undo log,因為insert時,原始的資料並不存在,所以回滾時把insert undo log丟棄即可,而update undo log則必須遵守上述過程。

眾所周知地是更新(update、insert、delete)是乙個事務過程,在innodb中,查詢也是乙個事務,唯讀事務。當讀寫事務併發訪問同一行資料時,能讀到什麼樣的內容則依賴事務級別:

上述更新前建立undo log,根據各種策略讀取時非阻塞就是mvcc,undo log中的行就是mvcc中的多版本,這個可能與我們所理解的mvcc有較大的出入,一般我們認為mvcc有下面幾個特點:

就是每行都有版本號,儲存時根據版本號決定是否成功,聽起來含有樂觀鎖的味道。。。,而innodb的實現方式是:

二者最本質的區別是,當修改資料時是否要排他鎖定,如果鎖定了還算不算是mvcc? 

innodb的實現真算不上mvcc,因為並沒有實現核心的多版本共存,undo log中的內容只是序列化的結果,記錄了多個事務的過程,不屬於多版本共存。但理想的mvcc是難以實現的,當事務僅修改一行記錄使用理想的mvcc模式是沒有問題的,可以通過比較版本號進行回滾;但當事務影響到多行資料時,理想的mvcc據無能為力了。

比如,如果transaciton1執行理想的mvcc,修改row1成功,而修改row2失敗,此時需要回滾row1,但因為row1沒有被鎖定,其資料可能又被transaction2所修改,如果此時回滾row1的內容,則會破壞transaction2的修改結果,導致transaction2違反acid。

理想mvcc難以實現的根本原因在於企圖通過樂觀鎖代替二段提交。修改兩行資料,但為了保證其一致性,與修改兩個分布式系統中的資料並無區別,而二提交是目前這種場景保證一致性的唯一手段。二段提交的本質是鎖定,樂觀鎖的本質是消除鎖定,二者矛盾,故理想的mvcc難以真正在實際中被應用,innodb只是借了mvcc這個名字,提供了讀的非阻塞而已。

MySQL學習筆記(一) MySQL基礎架構

mysql可分為server層和儲存引擎層兩部分 1.1 server層 聯結器 許可權驗證 盡量使用長連線,但是長連線會消耗記憶體,可以定時清理,也可以重新初始化鏈結資源 查快取 一般不用,除非讀多寫少 8.0移除 分析器 詞法分析,語法分析,語法解析 優化器 使用哪個索引 表連線順序 執行器 執...

MySQL學習筆記 MySQL的邏輯架構

server層 儲存引擎 聯結器負責與客戶端建立連線,獲取許可權,維持和管理連線 mysql h ip p port u user p長鏈結 短連線佔記憶體 select sql cache from t where id 10mysql8.0版本開始沒有查詢快取功能 詞法分析 語法分析 例如mys...

MySQL學習筆記(一)基礎架構

大體來說,mysql可以分為server層和儲存引擎層兩部分。server 層包括聯結器 查詢快取 分析器 優化器 執行器等,涵蓋mysql大多數核心服務功能,以及所有內建函式 如日期 時間 數學和加密函式等 所有跨儲存引擎的功能都在這一層實現,比如儲存過程 觸發器 檢視等等。而儲存引擎層負責資料的...