InnoDB 緩衝池是資料庫效能核心,其記憶體管理採用改良型 LRU(Least Recently Used)算法,並輔以多層次緩衝區設計。本文詳細剖析 LRU 列表結構、頁面生命週期、髒頁刷新機制、Redo Log Buffer 及額外記憶體池等關鍵組件。
傳統 LRU 將最新訪問頁面置於列表頭部,但全表掃描等操作會將大量非熱點頁面擠入頭部,導致真正熱點頁面被淘汰。InnoDB 引入 Midpoint 分割策略:
innodb_old_blocks_pct=37 控制)。頁面需在 Old 子列表停留一定時間(innodb_old_blocks_time,預設 0ms,建議設 1000ms)且被再次訪問,才能升級為 Young 頁面進入 New 子列表。此機制有效防禦全表掃描污染熱點數據。
page made young,受 innodb_old_blocks_time 限制;可通過 SHOW ENGINE INNODB STATUS 監控關鍵指標:Buffer pool hit rate(建議 >95%)、youngs/s、non-youngs/s、Modified db pages(髒頁數)等。
頁面被修改後標記為髒頁,同時存在於 LRU 列表與 Flush List(髒頁鏈表)中。InnoDB 透過 Checkpoint 定期將髒頁刷新至磁盤,Modified db pages 指標反映當前髒頁量。
事務日誌先寫入 innodb_log_buffer_size(預設 16MB),隨後按以下策略刷盤:
innodb_flush_log_at_trx_commit 控制);大小只需容納每秒產生的事務量即可,無需過大。
用於分配緩衝控制塊、鎖結構、等待資訊等內部元數據結構,參數 innodb_additional_mem_pool_size(預設 64MB)。緩衝池極大時需同步調大此參數,否則會從緩衝池借用空間影響效能。