对于2核4G的服务器运行MySQL,以下是一些关键的调优建议:
一、基础配置优化
1. 内存配置
# InnoDB缓冲池(核心参数)
innodb_buffer_pool_size = 2G # 建议为物理内存的50-60%
# 其他内存设置
key_buffer_size = 64M
query_cache_size = 0 # MySQL 8.0已移除,5.7建议关闭
tmp_table_size = 64M
max_heap_table_size = 64M
2. 连接和线程配置
max_connections = 150 # 根据应用需求调整,避免过高
thread_cache_size = 16
table_open_cache = 2000
二、InnoDB优化
1. 存储引擎配置
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2 # 平衡性能和数据安全
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
innodb_buffer_pool_instances = 2 # 与CPU核心数匹配
2. I/O优化
innodb_io_capacity = 200
innodb_io_capacity_max = 400
innodb_read_io_threads = 4
innodb_write_io_threads = 4
三、查询优化
1. 慢查询配置
slow_query_log = ON
long_query_time = 2
log_queries_not_using_indexes = ON
2. 查询缓存(MySQL 5.7)
query_cache_type = 0 # 关闭,在2核4G环境下通常弊大于利
四、系统级优化
1. 操作系统参数
# 调整文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 调整内核参数(CentOS/RHEL)
echo "vm.swappiness = 10" >> /etc/sysctl.conf
echo "vm.dirty_ratio = 10" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf
sysctl -p
2. 磁盘I/O优化
- 使用SSD硬盘(如果可能)
- 数据目录单独挂载
- 关闭atime更新:
noatime挂载选项
五、监控和诊断
1. 关键监控指标
-- 查看当前状态
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
SHOW GLOBAL STATUS LIKE 'Threads_%';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
-- 检查缓冲池命中率
SELECT (1 - (Variable_value / (SELECT Variable_value
FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_read_requests'))) * 100 AS hit_rate
FROM performance_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_reads';
2. 定期分析
-- 分析表
ANALYZE TABLE important_table;
-- 优化表(碎片整理)
OPTIMIZE TABLE fragmented_table;
六、应用层优化建议
- 连接池配置:应用层使用连接池,避免频繁创建连接
- 批量操作:尽量使用批量插入/更新
- 索引优化:确保常用查询有合适索引
- 查询简化:避免SELECT *,只查询必要字段
七、配置模板
创建/etc/my.cnf.d/custom.cnf(CentOS)或/etc/mysql/conf.d/custom.cnf(Ubuntu):
[mysqld]
# 基础配置
port = 3306
socket = /var/lib/mysql/mysql.sock
# 内存配置
innodb_buffer_pool_size = 2G
key_buffer_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M
# InnoDB配置
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
innodb_buffer_pool_instances = 2
# 连接配置
max_connections = 150
thread_cache_size = 16
table_open_cache = 2000
# 查询优化
slow_query_log = 1
long_query_time = 2
log_queries_not_using_indexes = 1
# 其他
skip_name_resolve = 1
八、注意事项
- 逐步调整:每次只修改1-2个参数,观察效果
- 备份配置:修改前备份原配置文件
- 压力测试:使用sysbench等工具测试调整效果
- 监控工具:安装Percona Monitoring and Management或Prometheus进行监控
九、重启和验证
# 重启MySQL
sudo systemctl restart mysqld # CentOS
sudo systemctl restart mysql # Ubuntu
# 验证配置
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
根据实际负载情况,可能需要进一步调整。建议先应用这些基础优化,然后通过监控工具观察性能指标,再进行针对性调优。
CLOUD技术笔记