InnoDB存儲引擎概述
體系結構
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZ3M2M0UWOidTZkBjZzQjNhV2NlN2MlNDOxQGOhBTY18CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
背景線程
Master Thread。主要負責将緩沖池中的資料異步重新整理到磁盤,保證資料的一緻性。包括:髒頁的重新整理、合并插入緩沖、undo頁的回收。
IO Thread。InnoDB中大量使用了AIO來處理寫請求,IO Thread主要負責這些IO請求的回調處理。
Purge Thread。事務被送出後,回收不再需要的undo頁
Page Cleaner Thread。重新整理髒頁,減輕Master Thread的工作,減少對使用者線程的阻塞。
記憶體池
緩沖池。
(資料/索引)頁從緩沖池重新整理到磁盤操作并不是每次頁發生更新時觸發,而是通過checkpoint機制重新整理回磁盤。
緩沖池中緩存的資料類型有:索引頁、資料頁、undo頁、插入緩沖、自适應哈希索引、innodb鎖資訊、資料字典資訊
緩沖池中頁的回收/重新整理回磁盤是通過LRU算法進行管理的。但是新的頁不是被放到LRu清單的頭部,而是放到了5/8處,這時為了防止偶爾的資料把熱點資料刷出緩存(比如表掃描)
重做日志緩沖。InnoDB首先将重做日志放到這個緩沖區,然後按一定頻率(每秒)重新整理到重做日志檔案中。
master thread每秒重新整理一次
每個事務送出時重新整理一次
緩沖池剩餘空間小于1/2時,重新整理一次
額外記憶體池。記錄了LRU中繼資料、鎖資訊等
checkpoint技術
事務資料庫普遍采用write ahead log政策。
(資料/索引)頁從緩沖池重新整理到磁盤操作并不是每次頁發生更新時觸發,索引當機後需要重做日志,但是不可能把重做日志從頭執行一遍,是以需要記錄資料庫目前持久化到哪一步了,也就是哪個檢查點checkpoint。
checkpoint作用:
縮短資料庫恢複時間
緩沖池不夠用時,将髒頁重新整理到磁盤時,要執行checkpoint
innodb通過LSN(log sequence number)8個位元組來标記版本。每個頁都有自己的LSN,重做日志也有LSN,checkpoint也有LSN。
正常關閉資料庫時,将所有髒頁重新整理回磁盤,三個LSN是一樣的。
運作時将部分髒頁重新整理回磁盤
插入緩沖
對非聚集索引且非唯一索引的插入和更新,不是每次直接插入到索引頁中,而是先判斷插入的非 聚集索引頁是否在緩沖池,如果在則直接插入;如果不在,則先放到insert buffer中。
insert buffer在寫密集的情況下,插入緩沖會占用過多的緩沖池記憶體
兩次寫
當發生當機時,innodb正在寫入某個頁到磁盤,而這個頁隻寫入了一部分,這種稱為部分寫失效。兩次寫就是為了解決這個問題
兩次寫分兩個部分。一個是記憶體中的double write緩沖,2MB,另一個時實體磁盤連續的兩個區,即128頁,2MB。
當需要将緩沖池的髒頁(索引、重做日志、資料頁)重新整理到磁盤時,并不是直接寫磁盤,而是先将髒頁複制到doublewrite buffer,之後将doublewrite buffer分兩次,每次将1M順序寫入共享表空間磁盤(不是資料庫檔案)後,立即調用fsync函數同步磁盤。共享表空間磁盤寫完後再寫入對應資料庫的表空間檔案。
如果在寫入磁盤時作業系統崩潰,回複過程中innodb會從double write中找到該頁的副本,将其父知道表空間檔案再應用重做日志。
磁盤最小機關時扇區512位元組。innodb中:1頁=16KB,1區=64頁=1M
自适應哈希索引
異步IO
重新整理鄰接頁
InnDB中的檔案
表
索引
鎖
事務
指令
show engine innodb status;