在 CentOS 上优化 MySQL,通常可以从 系统层面、MySQL 配置、硬件与架构、日常维护 四个方面来做。下面给你一套比较实用、可落地的优化思路(以 CentOS 7/8 + MySQL 5.7/8.0 为例)。
MySQL 对内存敏感,频繁 swap 会严重拖慢性能。
# 临时关闭
swapoff -a
# 永久关闭(注释 /etc/fstab 中 swap 行)
vim /etc/fstab
如不能完全关闭,至少降低 swappiness:
sysctl vm.swappiness=10
MySQL 连接多时会受限于文件数。
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
MySQL 配置中:
[mysqld]
open_files_limit = 65535
推荐使用 deadline 或 noop(SSD 用 noop):
# 查看
cat /sys/block/sda/queue/scheduler
# 临时修改
echo deadline > /sys/block/sda/queue/scheduler
相比 ext4,XFS 对数据库更友好。
路径一般为:
/etc/my.cnf
或
/etc/my.cnf.d/mysql-server.cnf
InnoDB 缓冲池(占物理内存 60%~80%)
innodb_buffer_pool_size = 4G
每个连接内存(避免过大)
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M
最大连接数
max_connections = 500
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 0
trx_commit=2性能更好,但宕机可能丢 1 秒数据(非金融场景可用)
MySQL 5.7:
query_cache_type = 0
query_cache_size = 0
(高并发下查询缓存反而拖累性能)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_error = /var/log/mysql/error.log
很多“慢”不是配置问题,而是 SQL 问题。
WHERE / JOIN / ORDER BY 字段加索引SELECT *LIKE '%xx'WHERE DATE(create_time)=)EXPLAIN SELECT ...
或开启慢查询后用:
mysqldumpslow -s t /var/log/mysql/slow.log
OPTIMIZE TABLE 表名; -- 碎片多时
ANALYZE TABLE 表名;
# 查看运行状态
mysqladmin status
mysql -e "SHOW PROCESSLIST;"
# 看瓶颈
top
iostat -x 1
free -m
[mysqld]
innodb_buffer_pool_size = 2G
max_connections = 300
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
slow_query_log = 1
long_query_time = 1
如果你愿意,可以告诉我:
我可以给你一套 针对性配置。