基於MySQL 5.6/5.7源碼分析,InnoDB為了高併發、高可靠性,自行實現了不依賴STL的核心數據結構,統一管理內存分配與線程同步。
特點:類似C++ vector,支援自定義內存分配器(Heap/OS malloc)。
struct ib_alloc_t {
ib_mem_alloc_t mem_malloc; // 分配函數指針
ib_mem_free_t mem_free; // 釋放函數指針
ib_mem_resize_t mem_resize; // 重分配函數指針
void* arg; // 堆句柄,NULL表示用系統malloc
};
qsort快速排序標準實現:ib_list_node_t含prev/next指針。
ib_list_create_heap(Heap)vs ib_list_create(malloc)struct ib_wqueue_t {
ib_mutex_t mutex; // 互斥鎖保護items
ib_list_t* items; // 底層用List實現
os_event_t event; // 信號量實現生產消費者通知
};
mutex保證隊列操作原子性event實現高效阻塞等待/喚醒創新點:自定義鏈式桶結構,非傳統List處理碰撞,支援泛型操作宏。
// 核心操作宏 HASH_INSERT, HASH_DELETE, HASH_GET_FIRST, HASH_GET_NEXT HASH_SEARCH, HASH_SEARCH_ALL, HASH_DELETE_AND_COMPACT HASH_MIGRATE // 用於Rehash遷移
並發優化:Cell級鎖粒度
n_sync_obj必須為2的N次方(如8、16、32)mutex與rw_lock兩種同步模式struct hash_table_t {
enum hash_table_sync_t type; // 同步類型
ulint n_cells; // 桶數量
hash_cell_t* array; // 桶數組
ulint n_sync_obj; // 鎖數量(2的冪)
union {
ib_mutex_t* mutexes;
rw_lock_t* rw_locks;
} sync_obj;
mem_heap_t** heaps; // 每個鎖對應一個Heap
mem_heap_t* heap; // 表級Heap
ulint magic_n; // 魔數校驗
};
| 維度 | InnoDB選擇 | 原因 |
|---|---|---|
| 內存管理 | 自定義Heap/Allocator | 統一監控、避免碎片、支援大頁內存 |
| 並發控制 | 細粒度鎖 + 自旋鎖 | 減少上下文切換、適配多核CPU |
| 數據結構 | 手寫C實現 | 避免STL異常拋出、二進制體積、編譯依賴 |
| 持久化感知 | 頁/表空間抽象 | 統一管理內存頁與磁盤頁映射 |