主要構成:
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...