天天看點

mysql技術内幕 inn..._《MySQL技術内幕InnoDB存儲引擎》讀書總結

InnoDB存儲引擎概述

體系結構

mysql技術内幕 inn..._《MySQL技術内幕InnoDB存儲引擎》讀書總結

背景線程

Master Thread。主要負責将緩沖池中的資料異步重新整理到磁盤,保證資料的一緻性。包括:髒頁的重新整理、合并插入緩沖、undo頁的回收。

IO Thread。InnoDB中大量使用了AIO來處理寫請求,IO Thread主要負責這些IO請求的回調處理。

Purge Thread。事務被送出後,回收不再需要的undo頁

Page Cleaner Thread。重新整理髒頁,減輕Master Thread的工作,減少對使用者線程的阻塞。

記憶體池

mysql技術内幕 inn..._《MySQL技術内幕InnoDB存儲引擎》讀書總結

緩沖池。

(資料/索引)頁從緩沖池重新整理到磁盤操作并不是每次頁發生更新時觸發,而是通過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;