數據庫屬 IO 密集型,內存訪問微秒級、磁盤毫秒級,差 3 個數量級。優化首要任務:把磁盤 IO 轉為內存 IO。本文系統梳理 9 大關鍵緩存參數。
query_cache_size / query_cache_type (Global)SELECT 結果集,命中則跳過解析/優化/引擎層,極快。query_cache_type=2 (DEMAND),SQL 顯式 SQL_CACHE 才緩存;query_cache_size=256M 起步,按命中率 Qcache_hits/(Qcache_hits+Qcache_inserts) 調整。binlog_cache_size (Global)Binlog_cache_disk_use(溢寫臨時文件計數)決定是否再增。key_buffer_size (Global)bulk_insert_buffer_size (Thread)INSERT ... SELECT、INSERT ... VALUES(...),(...)、LOAD DATA INFILE(非空表)。innodb_buffer_pool_size (Global) — 核心中的核心db_cache_size。(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%,目標 > 99%。innodb_additional_mem_pool_size (Global)error.log 會報 Warning 提示不足。innodb_log_buffer_size (Global)innodb_flush_log_at_trx_commit 條件再刷盤。innodb_flush_log_at_trx_commit:innodb_max_dirty_pages_pct (Global)1GB / innodb_buffer_pool_size(GB) * 100 以內,確保崩潰恢復 < 1GB 日志回放。可接受長啟動則可調至 90,不建議超 90。| 參數 | 建議值 | 備註 |
|---|---|---|
| query_cache_type | 0 (全 InnoDB) / 2 (MyISAM) | 配合 SQL_CACHE 顯式控制 |
| query_cache_size | 256 MB | 靜態數據可適當調大 |
| binlog_cache_size | 2~4 MB | 大事務環境 ≤ 32 MB |
| key_buffer_size | 16 MB (無 MyISAM) / 越大越好 | 裝下所有 MyISAM 索引 |
| bulk_insert_buffer_size | 8 MB | 批量導入 16~32 MB |
| innodb_buffer_pool_size | 越大越好 | 專用機 70~80% 物理內存 |
| innodb_additional_mem_pool_size | 8~16 MB | 對象多 32 MB,看 error.log |
| innodb_log_buffer_size | 1~8 MB | 高寫 4~8 MB,≤ 32 MB |
| innodb_max_dirty_pages_pct | ≤ 90 | 按 1GB 恢復時間反推 |
以上數值基於典型場景經驗,實際上線必須基準測試+持續觀測動態調整。歡迎技術交流。