首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

修改 InnoDB 頁大小優化 MySQL:源碼層面調整 UNIV_PAGE_SIZE 從 16K 到 4K/8K/32K

     編輯:MySQL 綜合教學

背景

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_SIZEUNIV_PAGE_SIZE_SHIFT適用場景
4 KB409612極窄行、高隨機 IO、SSD 4K 對齊友好
8 KB819213Oracle/PostgreSQL 遷移、兼容 8K 頁生態
16 KB1638414默認,通用負載平衡
32 KB3276815大行、順序掃描為主、壓縮頁場景
64 KB6553616極大行、列存/分析型負載(需測試穩定性)

約束:必須為 2 的冪次;UNIV_PAGE_SIZE_SHIFT 為對應指數。

修改示例:調整為 8 KB

/* 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

構建與驗證流程

  1. cmake . -DWITH_INNODB=ON ...(常規構建參數)
  2. make -j$(nproc)
  3. 全新初始化數據目錄:mysqld --initialize-insecure --datadir=/new/datadir
    ⚠️ 頁大小改變後,舊數據目錄完全不可用,必須重新初始化並導入邏輯備份。
  4. 驗證:SHOW 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 開銷。

避坑提醒

  • 不可熱修改:頁大小屬於實例級元數據,啟動時從數據文件讀取,運行時不可變。
  • 生態兼容:部分第三方工具(備份、監視、解析 binlog)可能假設 16K,需驗證兼容性。
  • 升級風險:官方版本升級需重新打補丁編譯,維護成本高;生產環境建議優先評估 innodb_compression、innodb_page_cleaners 等參數調優,實在受限才考慮定製構建。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved