MySQL性能优化需从硬件层、配置层、查询层、存储层四方面协同发力,形成闭环优化体系。
free -h命令监控)。mode=4为802.3ad模式)。/etc/sysctl.conf文件,优化TCP连接和文件描述符限制:# 增加TCP连接队列长度
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
# 允许更多并发连接
net.core.somaxconn = 4096
# 增加系统最大文件描述符数
fs.file-max = 65535
执行sysctl -p使配置生效。/etc/security/limits.conf,增加MySQL用户的文件描述符限制:mysql soft nofile 65535
mysql hard nofile 65535
MySQL配置文件路径为/etc/mysql/mysql.conf.d/mysqld.cnf,需根据硬件规格和业务场景调整核心参数:
innodb_buffer_pool_size = 20G。innodb_log_buffer_size = 128M。tmp_table_size = 64M,max_heap_table_size = 64M。0:每秒刷盘一次,性能最高但风险最高(崩溃可能丢失1秒数据,适合非核心业务);1(默认):事务提交时立即刷盘,最安全但性能最低(适合金融等强一致性场景);2:事务提交时写入OS缓存,每秒由OS刷盘,崩溃时可能丢失1秒数据(适合一般业务)。O_DIRECT(避免双重缓存)。max_connections = 500。wait_timeout = 28800,interactive_timeout = 28800。通过EXPLAIN命令查看查询执行计划,识别性能瓶颈(如全表扫描、未使用索引):
EXPLAIN SELECT * FROM users WHERE username = 'admin';
重点关注:
type:访问类型(ALL为全表扫描,需优化);key:使用的索引(若为NULL,需添加索引);rows:预估扫描行数(越小越好)。WHERE、JOIN、ORDER BY的列创建索引(如username、order_id);避免过度索引(每个索引会增加写操作开销)。CREATE INDEX idx_username ON users(username);SELECT username FROM users WHERE username = 'admin',username字段有索引)。WHERE YEAR(create_time) = 2025),不使用OR连接未索引的列。SELECT id, username FROM users)。SELECT u.username FROM users u JOIN orders o ON u.id = o.user_id)。SELECT * FROM products LIMIT 10)。WHERE DATE(create_time) = '2025-09-27',会导致索引失效。long_query_time = 2),用于定位慢查询。[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
重启MySQL使配置生效:sudo systemctl restart mysql。OPTIMIZE TABLE命令整理表空间,减少碎片(适用于频繁更新的表)。OPTIMIZE TABLE users;ANALYZE TABLE命令更新表的统计信息,帮助优化器选择更好的执行计划。ANALYZE TABLE orders;注意:所有优化操作前需备份数据库(如mysqldump -u root -p dbname > backup.sql),并在测试环境中验证效果,避免影响生产环境。