温馨提示×

centos怎么优化mysql性能

小樊
37
2026-10-23 07:30:14
栏目: 云计算

在 CentOS 上优化 MySQL 性能,通常可以从 系统层面、MySQL 配置、Schema 与 SQL、监控与维护 四个方面入手。下面给你一份实用、可落地的优化指南(以 CentOS 7/8 + MySQL 5.7/8.0 为例)。


一、系统层面优化(CentOS)

1. 关闭不必要的服务

systemctl disable firewalld --now   # 如不在公网可关
systemctl disable postfix

2. 调整内核参数(/etc/sysctl.conf)

# 文件句柄
fs.file-max = 1000000

# TCP 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192

# Swap 使用策略
vm.swappiness = 10

执行:

sysctl -p

3. 文件描述符限制

/etc/security/limits.conf

mysql soft nofile 65535
mysql hard nofile 65535

4. 磁盘与文件系统

  • 使用 XFS / ext4
  • 挂载参数:
defaults,noatime,nodiratime
  • 尽量使用 SSD
  • 分离数据盘与系统盘

二、MySQL 配置文件优化(核心)

配置文件位置:

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

1. 基础内存配置(示例:16G 内存)

[mysqld]
# 缓冲池(最重要)
innodb_buffer_pool_size = 10G
innodb_buffer_pool_instances = 8

# 日志
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0

# 连接
max_connections = 500
max_allowed_packet = 64M

2. IO 与线程

innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_thread_concurrency = 0

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_queries_not_using_indexes = 1

重启 MySQL:

systemctl restart mysqld

三、数据库设计与 SQL 优化

1. 表结构设计

  • 使用 InnoDB
  • 合理主键(自增 INT / BIGINT)
  • 避免 TEXT/BLOB 滥用
  • 字段尽量 NOT NULL

2. 索引优化

EXPLAIN SELECT * FROM user WHERE name='tom';

原则:

  • 高选择性字段建索引
  • 联合索引遵循最左前缀
  • 避免函数索引(如 WHERE DATE(created)=)

3. SQL 优化

  • 避免 SELECT *
  • 避免 LIKE '%xx'
  • 分页优化:
-- 不推荐
LIMIT 1000000,10

-- 推荐
WHERE id > 1000000 LIMIT 10

四、维护与监控

1. 定期维护

OPTIMIZE TABLE table_name;  # 小表
ANALYZE TABLE table_name;

2. 监控工具

  • SHOW PROCESSLIST;
  • SHOW GLOBAL STATUS;
  • 慢查询日志
  • 第三方:
    • Prometheus + mysqld_exporter
    • pt-query-digest

五、常见性能问题速查

现象 可能原因
CPU 高 慢 SQL / 缺索引
IO 高 buffer pool 太小
连接暴涨 连接未释放
内存爆 buffer pool 过大

六、推荐配置模板(16G 示例)

innodb_buffer_pool_size=10G
innodb_log_file_size=1G
max_connections=500
slow_query_log=1
long_query_time=1

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

  • MySQL 版本
  • 内存大小
  • 主要业务类型(读多 / 写多 / 混合)

我可以给你 定制化的 my.cnf 配置。

0 踩