温馨提示×

centos怎么优化mysql

小樊
35
2026-10-20 07:07:34
栏目: 云计算

在 CentOS 上优化 MySQL,通常可以从 系统层面、MySQL 配置、硬件与架构、日常维护 四个方面来做。下面给你一套比较实用、可落地的优化思路(以 CentOS 7/8 + MySQL 5.7/8.0 为例)。


一、系统层面优化(CentOS)

1. 关闭 Swap(或降低使用)

MySQL 对内存敏感,频繁 swap 会严重拖慢性能。

# 临时关闭
swapoff -a

# 永久关闭(注释 /etc/fstab 中 swap 行)
vim /etc/fstab

如不能完全关闭,至少降低 swappiness:

sysctl vm.swappiness=10

2. 调整文件描述符

MySQL 连接多时会受限于文件数。

vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

MySQL 配置中:

[mysqld]
open_files_limit = 65535

3. 磁盘 I/O 调度

推荐使用 deadline 或 noop(SSD 用 noop):

# 查看
cat /sys/block/sda/queue/scheduler

# 临时修改
echo deadline > /sys/block/sda/queue/scheduler

4. 使用 XFS 文件系统(推荐)

相比 ext4,XFS 对数据库更友好。


二、MySQL 核心参数优化(my.cnf)

路径一般为:

/etc/my.cnf
或
/etc/my.cnf.d/mysql-server.cnf

1. 内存相关(最重要)

InnoDB 缓冲池(占物理内存 60%~80%)

innodb_buffer_pool_size = 4G

每个连接内存(避免过大)

sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M

最大连接数

max_connections = 500

2. InnoDB 优化

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 秒数据(非金融场景可用)


3. 查询缓存(MySQL 8 已移除)

MySQL 5.7:

query_cache_type = 0
query_cache_size = 0

(高并发下查询缓存反而拖累性能)


4. 慢查询与日志

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 与索引优化(最关键)

很多“慢”不是配置问题,而是 SQL 问题。

1. 必做

  • 给 WHERE / JOIN / ORDER BY 字段加索引
  • 避免 SELECT *
  • 避免 LIKE '%xx'
  • 避免函数在索引列上(如 WHERE DATE(create_time)=)

2. 分析工具

EXPLAIN SELECT ...

或开启慢查询后用:

mysqldumpslow -s t /var/log/mysql/slow.log

四、架构与维护优化

1. 主从复制(读写分离)

  • 写主库,读从库
  • 减轻单节点压力

2. 定期维护

OPTIMIZE TABLE 表名;  -- 碎片多时
ANALYZE TABLE 表名;

3. 使用连接池

  • 应用端用连接池(如 HikariCP、Druid)
  • 避免短连接风暴

五、快速检查清单(排查慢)

# 查看运行状态
mysqladmin status
mysql -e "SHOW PROCESSLIST;"

# 看瓶颈
top
iostat -x 1
free -m

六、示例:通用优化 my.cnf(4G 内存)

[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

如果你愿意,可以告诉我:

  • CentOS 版本
  • MySQL 版本
  • 内存大小
  • 主要用途(Web / 报表 / 高并发)

我可以给你一套 针对性配置。

0 踩