- 內存相關配置
innodb_buffer_pool_size:這是 InnoDB 存儲引擎最重要的參數,用于緩存數據和索引。建議設置為服務器可用內存的 50%-70%(對于專用數據庫服務器)。
innodb_buffer_pool_size = 8G # 根據服務器內存調整
innodb_log_buffer_size:用于緩存 InnoDB 日志。對于寫入頻繁的系統,可適當調大(默認 16M):
innodb_log_buffer_size = 64M
key_buffer_size:用于 MyISAM 表的索引緩存(如果使用 MyISAM):
key_buffer_size = 256M
query_cache_size:注意 MySQL 8.0 已移除查詢緩存,對于 5.7 及以下版本,如果查詢重復率高可開啟:
query_cache_size = 64M
query_cache_type = 1
- 連接與線程配置
max_connections:最大并發連接數,根據業務需求調整:
max_connections = 1000
thread_cache_size:線程緩存大小,減少創建新線程的開銷:
thread_cache_size = 64
wait_timeout 和 interactive_timeout:控制空閑連接超時時間,避免連接泄露:
wait_timeout = 600
interactive_timeout = 600
- InnoDB 存儲引擎優化
innodb_flush_log_at_trx_commit:控制事務日志刷新策略:
1(默認):每次事務提交都刷新到磁盤,最安全但性能較低
0:每秒刷新一次,性能好但可能丟失 1 秒數據
2:提交時寫入日志文件但不立即刷新到磁盤
innodb_flush_log_at_trx_commit = 1 # 對數據安全性要求高時使用
innodb_file_per_table:為每個表創建獨立的表空間,便于管理:
innodb_file_per_table = 1
innodb_log_file_size 和 innodb_log_files_in_group:日志文件大小和數量:
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
innodb_flush_method:控制 InnoDB 如何刷新數據到磁盤,建議在 Linux 下使用 O_DIRECT:
innodb_flush_method = O_DIRECT
- 查詢優化相關
slow_query_log:開啟慢查詢日志,便于定位性能問題:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 超過2秒的查詢記錄為慢查詢
join_buffer_size:表連接緩存,不宜過大(默認 256K):
join_buffer_size = 256K
sort_buffer_size:排序緩存,每個連接獨占,不宜過大:
sort_buffer_size = 2M
- 其他重要配置
max_allowed_packet:控制最大數據包大小,對于大字段(如 TEXT)需要調大:
max_allowed_packet = 64M
table_open_cache:表緩存數量,根據數據庫表數量調整:
table_open_cache = 2048
innodb_read_io_threads 和 innodb_write_io_threads:IO 線程數量,多核服務器可增加:
innodb_read_io_threads = 8
innodb_write_io_threads = 8
優化建議
根據工作負載調整:OLTP(事務處理)和 OLAP(分析處理) workload 需要不同的配置
逐步調整:每次只修改少數參數,測試性能變化
監控效果:使用SHOW STATUS、SHOW VARIABLES和EXPLAIN等工具監控優化效果
定期更新統計信息:執行ANALYZE TABLE或開啟innodb_stats_auto_recalc
考慮硬件因素:配置應與服務器硬件(CPU、內存、磁盤類型)相匹配
配置優化后,需要重啟 MySQL 服務使更改生效,并通過實際負載測試驗證優化效果。