資料庫優化遵循三大鐵律:
本文圍繞「調大緩存、禁用無用引擎、簡化權限、硬體升級策略」四大支柱展開。
table_open_cache = 4000 # 監控 Opened_tables 判斷是否足夠
SHOW STATUS LIKE 'Opened_tables';
-- 數值穩定/緩慢增長 = 適當;快速增長 = 需調大
open_files_limit 限制。key_buffer_size = 1G # 物理記憶體 25% 左右,專供 MyISAM 索引塊
-- MySQL 4.1+ 支援多鍵緩存,可為熱點表專屬分配
SET GLOBAL hot_cache.key_buffer_size = 256M;
CACHE INDEX hot_table IN hot_cache;
LOAD INDEX INTO CACHE hot_table;
innodb_buffer_pool_size = 物理記憶體 60-80%
innodb_log_buffer_size = 16M-64M
-- 核心指標
SHOW ENGINE INNODB STATUS\G
-- 關注 Buffer pool hit rate (目標 > 99%)
bdb_cache_size = 64M # 僅使用 BDB 表時啟用
query_cache_type = 1 # ON
query_cache_size = 64M
query_cache_limit = 2M
-- 客戶端可覆寫
SET SESSION query_cache_type = OFF;
SELECT SQL_NO_CACHE * FROM frequently_updated_table;
my-small/medium/large/huge.cnf 為基線。[mysqld]
skip-innodb # 不用 InnoDB 時 (極少見)
skip-bdb # 不用 BDB
# 編譯時排除
./configure --without-innodb --without-bdb
mysql.tables_priv、mysql.columns_priv 為空。user、db、host 三表權限,服務器可跳過表/欄位級檢查,顯著降低高併發下的權限驗證 CPU。解決「熱表索引被冷表擠出緩存」問題:
-- 1. 建立專屬緩存 (需 SUPER 權限)
SET GLOBAL member_cache.key_buffer_size = 1024*1024; -- 1MB
-- 2. 指定表使用該緩存
CACHE INDEX member IN member_cache;
-- 3. 預載入索引至緩存
LOAD INDEX INTO CACHE member;
| 優先級 | 投資 | 效果 | 成本 | 備註 |
|---|---|---|---|---|
| 1 | 增加記憶體 | 指數級:緩存命中率↑、磁碟 I/O↓、Sort/JOIN 全記憶體 | 低 | 首選,立竿見影 |
| 2 | 關閉 Swap / 用 tmpfs | 消除交換抖動,延遲抖動歸零 | 零 | 需足夠記憶體支撐 |
| 3 | 更快磁碟 (NVMe SSD / RAID 10) | 線性提升:隨機 IOPS 從 200 → 100k+ | 中 | 分離 data/log/binlog/備份到不同物理裝置 |
| 4 | 多 CPU 核心 / 多插槽 | 並行查詢、並行備份、並行 DDL | 高 | MySQL 5.7+ 並行度較好,8.0 更強 |
| 5 | RAID 控制器帶電池緩存 (BBWC/FBWC) | 寫入延遲從 ms 降至 μs,等同偽 fsync 但安全 | 中 | 解決 innodb_flush_log_at_trx_commit=1 效能痛點 |
管理員優化的本質是資源重新分配:將有限的記憶體、CPU、I/O 頻寬,精準投放到「熱索引、熱數據、高併發查詢」上。建立「指標監控 → 瓶頸定位 → 參數調整 → 壓測驗證 → 固化配置」標準化流程,讓優化從經驗主義走向數據驅動工程。