Mysql框架分析和Innodb分析

2021-07-11 04:14:51 字數 2362 閱讀 3892

主要構成:

1. 連線池元件

2. 管理服務

3. 工具

4. sql介面

5. 查詢分析器

6. 優化器

7. 緩衝

8. 插入式儲存引擎

9. 物理儲存檔案

工作方式:將資料檔案按頁(每頁16k)讀入innodb buffer pool,然後按最近最少使用演算法(lru)保留快取資料快取的資料頁型別包括 索引頁 資料頁 undo頁 insert buffer 自適應雜湊索引 innodb鎖資訊以及資料字典資訊等),通過一定頻率重新整理到檔案。

後台執行緒預設7個:4個io thread,1個master thread,1個鎖監控執行緒,1個錯誤執行緒

master thread:由四個迴圈組成:

1. 主迴圈

2. 後台迴圈

3. 重新整理迴圈

4. 掛起迴圈

插入快取

二次寫自適應hash索引

插入快取

需要插入快取的原因:

主鍵索引為聚集索引,輔助索引(非聚集索引)是依賴於聚集索引,如果對非聚集索引關鍵字進行更新修改,索引需要多次操作。

解決方法:

為了解決這個問題,innodb設計出了插入緩衝技術,對於非聚集類索引的插入和更新操作,不是每一次都直接插入到索引頁中,而是先插入到記憶體中。具體做法是:如果該索引頁在緩衝池中,直接插入;否則,先將其放入插入緩衝區中,再以一定的頻率和索引頁合併,這時,就可以將同乙個索引頁中的多個插入合併到乙個io操作中,大大提高寫效能。這個設計思路和hbase中的lsm樹有相似之處,都是通過先在記憶體中修改,到達一定量後,再和磁碟中的資料合併,目的都是為了提高寫效能。

啟用需要滿足一下兩個條件:

1)索引是輔助索引(secondary index)

2)索引不適合唯一的

如果輔助索引是唯一的,就不能使用該技術,原因很簡單,因為如果這樣做,整個索引資料被切分為2部分,無法保證唯一性。

缺點:

任何一項技術在帶來好處的同時,必然也帶來壞處。插入緩衝主要帶來如下兩個壞處:

1)可能導致資料庫宕機後例項恢復時間變長。如果應用程式執行大量的插入和更新操作,且涉及非唯一的聚集索引,一旦出現宕機,這時就有大量記憶體中的插入緩衝區資料沒有合併至索引頁中,導致例項恢復時間會很長。

2)在寫密集的情況下,插入緩衝會占用過多的緩衝池記憶體,預設情況下最大可以占用1/2,這在實際應用中會帶來一定的問題。

二次寫:

想象這麼乙個場景,當資料庫正在從記憶體向磁碟寫乙個資料頁時,資料庫宕機,從而導致這個頁只寫了部分資料,這就是部分寫失效,它會導致資料丟失。這時是無法通過重做日誌恢復的,因為重做日誌記錄的是對頁的物理修改,如果頁本身已經損壞,重做日誌也無能為力。

需要額外新增兩個部分:

1)記憶體中的兩次寫緩衝(doublewrite buffer),大小為2mb

2)磁碟上共享表空間中連續的128頁,大小也為2mb

其原理是這樣的:

1)當重新整理緩衝池髒頁時,並不直接寫到資料檔案中,而是先拷貝至記憶體中的兩次寫緩衝區

2)接著從兩次寫緩衝區分兩次寫入磁碟共享表空間(磁碟)中,每次寫入1mb

3)待第2步完成後,再將兩次寫緩衝區寫入資料檔案

這樣就可以解決上文提到的部分寫失效的問題,因為在磁碟共享表空間中已有資料頁副本拷貝,如果資料庫在頁寫入資料檔案的過程中宕機,在例項恢復時,可以從共享表空間中找到該頁副本,將其拷貝覆蓋原有的資料頁,再應用重做日誌即可。

自適應hash索引:

innodb儲存引擎會監控對錶上索引的查詢,如果觀察到建立雜湊索引可以帶來速度的提公升,則建立雜湊索引,所以稱之為自適應(adaptive) 的。自適應雜湊索引通過緩衝池的b+樹構造而來,因此建立的速度很快。而且不需要將整個表都建雜湊索引,innodb儲存引擎會自動根據訪問的頻率和模式 來為某些頁建立雜湊索引。

MYSQL資料庫引擎,ISAM和INNODB

其餘都屬於第二類,稱為 非事務安全型 non transaction safe 1 isam isam是乙個定義明確且歷經時間考驗的資料 管理方法,它在設計之時就考慮到資料庫被查詢的次數要遠大於更新的次數。因此,isam執行讀取操作的速度很快,而且不占用大量的記憶體和儲存資源。isam的兩個主要不足...

mysql引擎之MyISAM與InnoDB

在mysql中,支援幾種引擎,其中包括myisam與innodb,兩者皆採用b tree的資料結構,樹 鍊錶 myisam 索引和資料是分開的,也叫非聚集索引,不管是以自增id作為索引還是以其他作為索引,最下層的葉子節點存放的是乙個實體地址,通過這個實體地址找到需要的資料 索引和資料是分開的,也叫聚...

MYSQL框架和引擎

注意 隨著mysql的更新,以下的以下結論可能會過時.下面的都是我從書中了解到的.請以最新的為準 mysql在軟體設計上採用基於元件的模組化設計,c c 開發 包含以下字系統 模組 和核心庫 mysqlnd mysql原生的驅動程式 mysql native driver mysqlnd是通過zen...