MySQL 行為由 my.cnf(Linux)或 my.ini(Windows)控制。官方提供五組預設範本,依記憶體與負載選擇。本文逐段解析預設 /etc/my.cnf 結構、五大範本差異與關鍵參數調整方向。
| 檔案 | 適用場景 | 建議記憶體 | 關鍵預設值 |
|---|---|---|---|
my-small.cnf | 嵌入式/測試,< 100 連線 | ≤ 64MB | key_buffer=16K, table_cache=4 |
my-medium.cnf | 中型應用,共用主機 | 128-256MB | key_buffer=16M, table_cache=64, sort_buffer=512K |
my-large.cnf | 專用 DB 伺服器 | 512MB-1GB | key_buffer=256M, table_cache=256, myisam_sort_buffer=8M, log-bin |
my-huge.cnf | 企業級高負載專用機 | ≥ 1-2GB | key_buffer=384M, table_cache=512, read_buffer=2M, write_buffer=2M |
my-innodb-heavy-4G.cnf (5.5+) | InnoDB 專用大記憶體 | ≥ 4GB | innodb_buffer_pool_size=2G, innodb_log_file_size=256M |
使用方式:cp /usr/share/mysql/my-medium.cnf /etc/my.cnf 後再微調。
/etc/my.cnf 結構解析[client]
port=3306
socket=/var/lib/mysql/mysql.sock
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# skip-innodb # 未用 InnoDB 時啟用
# 默認無 key_buffer_size 等效能參數,需自行添加
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]:所有客戶端工具(mysql、mysqldump)共用連線參數。[mysqld]:Server 核心參數區,效能調優主戰場。[mysqld_safe]:啟動腳本 mysqld_safe 讀取的日誌/ PID 設定。max_connections:最大連線數(預設 151,依 Max_used_connections 調整)。thread_cache_size:執行緒複用池(預設 0,建議 32-64)。back_log:TCP 監聽隊列長度(高併發衝刺時調大,受 OS somaxconn 限制)。key_buffer_size:MyISAM 索引快取(InnoDB 主力請改調 innodb_buffer_pool_size)。query_cache_size / query_cache_type:查詢快取(高寫入建議關閉,MySQL 8.0 已移除)。table_open_cache:表快取上限(配合 Open_tables/Opened_tables 調整)。sort_buffer_size:排序緩衝(預設 256K,複雜 ORDER BY 可調 1-2M)。read_buffer_size:全表掃描緩衝(預設 128K,建議 ≤ 8M)。read_rnd_buffer_size:排序後隨機讀緩衝。join_buffer_size:無索引 JOIN 緩衝(預設 256K,調大慎重)。tmp_table_size / max_heap_table_size:記憶體臨時表上限(必須同調)。innodb_buffer_pool_size:最關鍵參數,建議實體記憶體 60-80%。innodb_log_file_size:Redo Log 大小(大寫入量調大 256M-1G,重啟才生效)。innodb_flush_log_at_trx_commit:1=最安全、2=高效能、0=最高效能但可能丟 1 秒資料。innodb_file_per_table:獨立表空間(ON 便於管理、回收空間)。log_bin、binlog_format=ROW、expire_logs_days=7、max_binlog_size=1G。slow_query_log=1、long_query_time=1、log_queries_not_using_indexes=1。gtid_mode=ON、enforce_gtid_consistency=ON(現代複寫必備)。[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
避免 latin1 導致中文/Emoji 亂碼。
/etc/my.cnf。log_queries_not_using_indexes。SHOW GLOBAL STATUS 基準線。mysqldumpslow 分析慢查詢,優化 SQL/索引優於調參數。設定檔是 MySQL 行為的基因。理解五大範本定位、掌握核心參數分類、建立「監控→調整→驗證」閉環,才是持續優化的正途。