InnoDB 頁大小默認 16 KB(硬編碼常量 UNIV_PAGE_SIZE)。遷移自 Oracle/SQL Server(常用 8K 頁)的業務,若行較小、隨機讀寫比例高,16K 頁會導致 讀放大、寫放大、緩衝池利用率低。本文演示如何在源碼層修改頁大小並重新構建 MySQL。
文件:storage/innobase/include/univ.i
/* The universal page size of the database */
#define UNIV_PAGE_SIZE (2 * 8192) /* 16384 = 16K */
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14 /* 2^14 = 16384 */
| 目標頁大小 | UNIV_PAGE_SIZE | UNIV_PAGE_SIZE_SHIFT | 適用場景 |
|---|---|---|---|
| 4 KB | 4096 | 12 | 極窄行、高隨機 IO、SSD 4K 對齊友好 |
| 8 KB | 8192 | 13 | Oracle/PostgreSQL 遷移、兼容 8K 頁生態 |
| 16 KB | 16384 | 14 | 默認,通用負載平衡 |
| 32 KB | 32768 | 15 | 大行、順序掃描為主、壓縮頁場景 |
| 64 KB | 65536 | 16 | 極大行、列存/分析型負載(需測試穩定性) |
約束:必須為 2 的冪次;UNIV_PAGE_SIZE_SHIFT 為對應指數。
/* The universal page size of the database */
#define UNIV_PAGE_SIZE 8192
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 13
cmake . -DWITH_INNODB=ON ...(常規構建參數)make -j$(nproc)mysqld --initialize-insecure --datadir=/new/datadirSHOW GLOBAL VARIABLES LIKE 'innodb_page_size'; 應顯示 8192。sysbench / tpcc-mysql 對比 16K vs 8K 在目標負載下的 QPS、延遲、IOPS、緩衝池命中率。Innodb_page_size 變更對 innodb_buffer_pool_size 頁數、innodb_log_file_size 寫入放大的影響。innodb_compression(壓縮頁)在不同頁大小下的壓縮率與 CPU 開銷。innodb_compression、innodb_page_cleaners 等參數調優,實在受限才考慮定製構建。