核心性能變量分類速覽
MySQL 提供數十個影響性能的系統變量,按功能域可分為五大類。本文逐一解析核心參數的作用機制、默認值、調優方向與適用存儲引擎。
1. 緩存與緩衝區類
| 變量名 | 默認值 | 建議範圍 | 適用引擎 | 核心作用 |
| key_buffer_size | 8M | 物理內存 20-30% | MyISAM | 索引塊緩存,直接決定 MyISAM 查詢速度 |
| sort_buffer_size | 2M | 16M-64M | 所有 | ORDER BY/GROUP BY 排序緩存,每線程分配 |
| join_buffer_size | 256K | 128K-4M | 所有 | 無索引 JOIN 時的全表掃描緩存,每線程分配 |
| read_buffer_size | 128K | 1M-8M | 所有 | 順序掃描緩存,全表掃描時生效 |
| read_rnd_buffer_size | 256K | 1M-16M | 所有 | 隨機讀緩存,排序後按序讀取時生效 |
| bulk_insert_buffer_size | 8M | 16M-64M | MyISAM | 批量 INSERT 緩存(LOAD DATA/INSERT ... SELECT) |
| tmp_table_size | 16M | 64M-256M | 所有 | 內存臨時表大小上限,超限轉 MyISAM 磁盤表 |
2. 並發與鎖控制類
| 變量名 | 默認值 | 建議值 | 適用引擎 | 說明 |
| concurrent_insert | 1 | 1 或 2 | MyISAM | 1=無空洞並發插入,2=始終允許並發插入 |
| low_priority_updates | OFF | 視業務 | MyISAM | 寫操作讓位給讀操作,讀多寫少場景可開 |
| max_write_lock_count | 4294967295 | 視業務 | MyISAM | 寫鎖達閾值後允許讀鎖插隊,防寫飢餓 |
3. 索引與鍵緩存進階(MyISAM 專用)
key_cache_block_size:鍵緩存塊大小,默認 1024,大塊利於順序讀
key_cache_division_limit:熱點緩存保護比例,默認 100(100%),降低可保護熱數據
key_cache_age_threshold:降級閾值,默認 300,調低加速冷數據淘汰
4. 日誌與持久化類
| 變量名 | 默認值 | 建議值 | 說明 |
| delay_key_write | ON | ON | MyISAM 延遲索引寫入,崩潰需 REPAIR TABLE |
| flush | OFF | OFF | 每次寫入強制 fsync,極大降性能,僅極端安全場景開啟 |
| flush_time | 0 | 0 | 定期刷新間隔(秒),Windows 9x 遺留,現代系統勿用 |
| expire_logs_days | 0 | 7-30 | Binlog 自動清理天數,0=不自動清理,建議配合備份策略設置 |
5. 全文搜索與特殊功能類
ft_min_word_len/ft_max_word_len:全文索引詞長度範圍,修改需重建索引
ft_stopword_file:停用詞表路徑,可自定義
large_pages:大頁面支援(HugePages),需 OS 配合,InnoDB/MyISAM 均受益
InnoDB 專屬核心參數(補充)
本文變量多為 MyISAM/通用參數。InnoDB 關鍵參數另文詳述,包含:
innodb_buffer_pool_size(核心,建議 70-80% 物理內存)
innodb_log_file_size/innodb_log_buffer_size
innodb_flush_log_at_trx_commit(1=最安全,2/0=高性能)
innodb_thread_concurrency(0=不限,建議 2×CPU 核心數)
調優原則與避坑
- 按需分配:每線程緩存(sort/join/read)× 最大連接數 ≠ 總內存,預留 OS/其他進程內存
- 漸進式調整:單次修改一個參數,觀測負載測試指標(QPS、延遲、CPU、IO)
- 監控優先:先看
SHOW GLOBAL STATUS 如 Created_tmp_disk_tables、Sort_merge_passes、Key_reads 等計數器
- 持久化配置:生效後同步寫入
my.cnf,防重啟失效