在 CentOS 上优化 MySQL,可以从 系统层面、MySQL 配置、SQL 与索引、监控与维护 四个方面来做。下面给你一套实用、可落地的优化方案(以 CentOS 7/8 + MySQL 5.7/8.0 为例)。
free -h
swapon -s
建议:
sysctl vm.swappiness=10
写入:
echo "vm.swappiness=10" >> /etc/sysctl.conf
ulimit -n
修改:
vi /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
xfsdefaults,noatime,nodiratime
vi /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
sysctl -p
配置文件位置:
/etc/my.cnf
或
/etc/my.cnf.d/mysql-server.cnf
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0
max_connections = 500
thread_cache_size = 50
wait_timeout = 300
interactive_timeout = 300
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
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
分析:
mysqldumpslow -s t /var/log/mysql/slow.log
WHERE DATE(create_time) = ...
LIKE '%abc'
EXPLAIN SELECT * FROM user WHERE name='tom';
关注:
OPTIMIZE TABLE table_name;
或
mysqlcheck -o -A
ANALYZE TABLE table_name;
top, iostat, vmstatmysqladmin statuspt-query-digest| 场景 | 建议 |
|---|---|
| 读多写少 | 加大 buffer pool |
| 写多 | 调整 redo log、关闭双写 |
| 高并发 | 调大 max_connections |
| 主从 | 开启 binlog,优化复制线程 |
如果你愿意,可以告诉我:
我可以直接给你一份 可复制的 my.cnf 配置。