my.cnf(Windows 下為 my.ini)是 MySQL 伺服器的核心配置檔,合理調整參數能顯著提升效能與穩定性。本文系統整理常用參數分類、作用與建議值,供 DBA 與開發者查閱調優。
基本路徑與核心目錄設定
| 參數 | 說明 | 典型值/建議 |
| basedir | MySQL 安裝根目錄 | /usr/local/mysql |
| datadir | 資料檔存放目錄 | /var/lib/mysql |
| socket | 本地通訊 Socket 檔(Linux) | /var/lib/mysql/mysql.sock |
| pid-file | 進程 ID 檔路徑 | /var/run/mysqld/mysqld.pid |
| lower_case_table_name | 表名大小寫敏感度(1=不敏感) | Windows 建議 1,Linux 建議 0 |
字符集與語言設定
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# init_connect = 'SET NAMES utf8mb4' # 連線自動設定字符集
建議:全環境統一使用 utf8mb4 支援完整 Unicode(含 Emoji),避免亂碼。
網路、連線與安全
| 參數 | 說明 | 建議 |
| port | TCP 監聽埠 | 3306(生產環境建議修改非預設埠) |
| bind-address | 綁定 IP,0.0.0.0 監聽所有介面 | 內網 IP 或 127.0.0.1(僅本機) |
| max_connections | 最大同時連線數 | 視記憶體而定,如 500~2000 |
| skip-name-resolve | 禁用 DNS 解析,加速連線 | 生產環境建議開啟 |
| skip-networking | 僅允許本地 Socket 連線 | 極高安全需求時啟用 |
| max_allowed_packet | 單次封包最大長度 | 64M~256M(防大欄位截斷) |
記憶體、快取與查詢優化
| 參數 | 說明 | 建議值(4GB RAM 範例) |
| key_buffer_size | MyISAM 索引快取 | 256M~512M |
| innodb_buffer_pool_size | InnoDB 核心快取(資料+索引) | 物理記憶體 60~80%(如 3G) |
| innodb_log_buffer_size | 事務日志快取 | 16M~64M |
| query_cache_type | 查詢快取模式(0=關/1=開/2=按需) | 0(MySQL 5.7+ 已棄用,建議關閉) |
| query_cache_size | 查詢快取大小 | 0 |
| tmp_table_size / max_heap_table_size | 記憶體臨時表上限 | 64M~256M |
| sort_buffer_size | 排序快取(每連線) | 2M~8M |
| read_buffer_size | 循序讀取快取(每連線) | 128K~256K |
| join_buffer_size | 無索引聯結快取(每連線) | 256K~1M |
| table_open_cache | 表快取數量 | 2000~4000 |
日志與二進制日志
# 一般查詢日志(除錯用,生產建議關閉)
# general_log = 1
# general_log_file = /var/log/mysql/mysql.log
# 慢查詢日志(必開)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 超過 1 秒記錄
log_queries_not_using_indexes = 1
# 二進制日志(主從/時間點恢復必備)
log-bin = mysql-bin
server-id = 1
binlog_format = ROW # ROW 格式最安全
max_binlog_size = 100M
expire_logs_days = 7 # 自動清理 7 天前日志
sync_binlog = 1 # 每次提交同步刷盤(最安全)
InnoDB 核心參數
| 參數 | 說明 | 建議 |
| innodb_file_per_table | 獨立表空間 | ON(預設開啟) |
| innodb_flush_log_at_trx_commit | 事務提交刷盤策略 | 1(最安全),2(高效能妥協) |
| innodb_log_file_size | Redo log 檔案大小 | 256M~1G(總大小 = size × files_in_group) |
| innodb_log_files_in_group | Redo log 群組檔案數 | 2~4 |
| innodb_io_capacity | 磁碟 IOPS 能力提示 | SSD 建議 2000~5000 |
| innodb_thread_concurrency | InnoDB 並發執行緒上限 | 0(自動,MySQL 5.5+ 建議) |
主從複寫專用參數
Master 端
server-id = 1
log-bin = mysql-bin
binlog-do-db = business_db
binlog-ignore-db = mysql,information_schema,performance_schema
Slave 端
server-id = 2
relay-log = relay-bin
log-slave-updates = 1 # 級聯複寫需開啟
read-only = 1 # 防止誤寫入
replicate-do-db = business_db
replicate-ignore-db = mysql,information_schema,performance_schema
slave-skip-errors = 1062,1032 # 忽略主鍵衝突/找不到記錄(謹慎使用)
其他實用參數
default-storage-engine = InnoDB
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default-time-zone = '+08:00'
ft_min_word_len = 2(中文全文索引需配合 ngram parser)
配置生效與驗證
- 修改
my.cnf 後重啟:systemctl restart mysqld
- 登入 MySQL 驗證:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
- 觀察狀態指標:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
注意:參數調整需依實際硬體、負載型態測試驗證,切勿盲目套用網路範本。建議建立基準測試流程,單一參數變更觀察效果。