在 Linux 环境下优化 MySQL,通常可以从 系统层、MySQL 配置、Schema 与 SQL、监控与维护 四个维度来做。下面给你一个实用、可落地的优化思路(以 InnoDB 为主,适用于大多数业务场景)。
noatime,nodiratime
/var/lib/mysql/var/log/mysql# 提高文件描述符
ulimit -n 65535
# 系统层面
vm.swappiness = 5
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
innodb_buffer_pool_size = 物理内存的 60%~70%
innodb_buffer_pool_instances = 4~8
示例(16G 内存):
innodb_buffer_pool_size = 10G
innodb_flush_log_at_trx_commit = 2 # 性能优先
sync_binlog = 0 # 性能优先(主从需注意)
innodb_io_capacity = 2000 # SSD 可提高
innodb_io_capacity_max = 4000
max_connections = 500
thread_cache_size = 50
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
INT 而非 BIGINTVARCHAR 而非 TEXTNULL,用默认值WHERE / JOIN / ORDER BY 字段建索引LIKE '%xx'SELECT *-- 不推荐
LIMIT 1000000, 10
-- 推荐
WHERE id > 1000000 LIMIT 10
mysqldumpslow -s t /var/log/mysql/slow.log
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS;
SHOW GLOBAL STATUS LIKE 'Threads%';
OPTIMIZE TABLE(小表)ANALYZE TABLEPURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;
| 场景 | 建议 |
|---|---|
| 读多写少 | 加大 buffer pool,加从库 |
| 写多读少 | 减少索引,批量插入 |
| 高并发 | 连接池 + 读写分离 |
| 大数据量 | 分库分表 / 分区表 |
如果你愿意,可以告诉我:
我可以直接帮你 给出一份可复制的 my.cnf 配置。