MySQL 內存管理系統龐大而先進,在 mem0pool.c 文件頭部註釋中即有詳細說明。整體可劃分為四大管理部分,包含九大核心內存區域。本文將從緩沖池(Buffer Pool)切入,系統闡述其架構設計、五大功能模塊、四大核心結構體、六大關鍵鏈表及伙伴系統機制,為後續 LRU、刷新、讀取等專題分析奠定基礎。
九大內存區域:
四大管理部分:
Redo 日志緩衝由 Redo 子系統單獨管理;Buffer Pool 結構最複雜,內容最多;Common Pool 管理除 Buffer Pool、Log Buffer、Session 外的所有區域。


buf_block_struct、buf_page_struct)在非壓縮/壓縮 LRU 鏈表中的生命周期。核心功能:節點增刪 → 衍生分配/釋放塊 → 15 個外部主調用函數 + 14 個內部輔助函數(佔 LRU 總函數 60%+)。BUF_FLUSH_LRU:通過 LRU 鏈表刷新BUF_FLUSH_LIST:通過 Flush 鏈表刷新buf_page_struct.zip.data)的內存分配。但極其關鍵:Buffer Pool 最終服務於文件存儲、事務管理、主進程調度等外部接口,它們都需對頁中記錄進行讀寫。伙伴系統分配後,還需根據運行需要進行壓縮頁↔非壓縮頁轉換,是極端重要的組件。
buf_pool_structUT_LIST_BASE_NODE_T)os_event_t)LRU_old_ratio、LRU_list_mutex、page_hash_latch、free_list_mutex、page_hash、flush_list、free、LRU 等buf_chunk_structbuf_block_struct 掛載於 6 大鏈表並由 buf_pool_struct 管理,但其初始內存分配動作均在 buf_chunk_struct 初始化階段完成。它是 Buffer Pool 最基礎的內存分配單元。
struct buf_chunk_struct {
ulint mem_size; // 分配的塊大小
ulint size; // frames[] 和 blocks[] 的大小
void* mem; // 指向為 frames 分配的內存區域
buf_block_t* blocks; // 指向 buf_block_t 數組
};
buf_block_structbuf_page_t page:壓縮頁結構體引用(必須為首字段,便於哈希表指向)byte* frame:指向大小為 UNIV_PAGE_SIZE、地址對齊的緩衝頁幀(**Buffer Pool 服務的核心**,所有修改針對此內存區,寫回磁盤由異步 IO 處理)buf_page_structspace) 與頁偏移量 (offset)flush_type:BUF_FLUSH_LRU/BUF_FLUSH_LIST)、IO 固定類型 (io_fix)、緩衝固定計數 (buf_fix_count)free、flush_list、zip_list、LRU、unzip_LRU 除外)
buf_pool->free)buf_pool->LRU)BUF_FLUSH_LRU)。Flush 節點釋放後同步移除 LRU 髒塊。LRU、免費、Flush 三鏈表與五模塊千絲萬縷。buf_pool->unzip_LRU)buf_pool->flush_list)buf_pool_struct 管理。buf_pool->zip_clean)buf_pool->zip_free[])Buffer Pool 整體概述暫告段落。後續將陸續深入分析:LRU 替換算法詳解、刷新機制實現、伙伴系統內存管理、讀取路徑與預讀策略、雙寫緩衝、實例管理與擴展性設計等專題。歡迎指正文中任何錯誤,讓我們共同探索 MySQL 內核奧秘。