在 Ubuntu 上优化 MySQL 性能,一般可以从 系统层面、MySQL 配置、Schema 与 SQL、监控与维护 四个方面入手。下面给你一份比较实用、可落地的优化清单(以 MySQL 5.7 / 8.0 为例)。
推荐 ext4 / xfs:
mount -o noatime,nodiratime /dev/sdb /var/lib/mysql
避免 MySQL 被 swap:
sysctl -w vm.swappiness=1
写入 /etc/sysctl.conf 持久化。
ulimit -n 65535
在 /etc/security/limits.conf 中配置 mysql 用户。
配置文件一般位于:
/etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 4G # 物理内存的 60%~80%
innodb_buffer_pool_instances = 4
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2 # 性能优先(可接受少量丢数据)
innodb_flush_method = O_DIRECT
max_connections = 500
thread_cache_size = 100
MySQL 5.7:
query_cache_type = 0
query_cache_size = 0
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
WHERE / JOIN / ORDER BY 字段建索引LIKE '%xx'EXPLAIN SELECT * FROM user WHERE email='a@b.com';
INT 而非 VARCHAR)SELECT *ORDER BY RAND()OPTIMIZE TABLE table_name;
ANALYZE TABLE table_name;
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
mysqltunerpt-query-digestSHOW PROCESSLIST;SHOW ENGINE INNODB STATUS;| 场景 | 建议 |
|---|---|
| 读多写少 | 加大 buffer pool,加从库 |
| 写密集 | SSD + 调整 redo log |
| 高并发 | 连接池 + 读写分离 |
| 大数据量 | 分库分表 / 分区表 |
如果你愿意,可以告诉我:
my.cnf我可以帮你 针对性调优甚至直接改配置。