✅ 一、推荐的 my.cnf(生产环境优化模板)
⚠️ 你只需要修改:
- 内存大小(服务器内存 16G / 32G / 64G)
- 磁盘路径
- InnoDB buffer pool size
下面的配置假设你的服务器 16GB RAM
js
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
# ========== 基础设置 ==========
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysqld.pid
socket = /data/mysql/mysql.sock
character-set-server = utf8mb4
skip-name-resolve # 禁止 DNS 反查(性能明显提升)
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
table_open_cache = 4096
open_files_limit = 8192
# ========== InnoDB 重要优化 ==========
innodb_buffer_pool_size = 8G # 16G 机器设置为 8G(50% 内存)
innodb_buffer_pool_instances = 8 # buffer pool 分片(每G一个比较合适)
innodb_log_file_size = 1G # redo log 单个大小,能减少 checkpoint 开销
innodb_log_buffer_size = 64M # 写密集场景建议 64M~256M
innodb_flush_log_at_trx_commit = 1 # 强一致性(建议生产默认 1)
# 建议:高 QPS 场景可改为 2(性能提升10倍,丢事务 "1s 内")
innodb_flush_method = O_DIRECT # 避免双缓存
innodb_file_per_table = 1 # 强烈推荐,表独立文件
innodb_io_capacity = 4000 # SSD 建议 2000~8000
innodb_io_capacity_max = 8000
# ========== 连接管理 ==========
max_connections = 2000 # 大项目需要更高连接数
max_connect_errors = 10
wait_timeout = 600 # 空闲连接超时
interactive_timeout = 600
# ========== 查询缓存相关(MySQL 5.7 才有) ==========
query_cache_type = 0
query_cache_size = 0
# ========== 日志设置 ==========
log_error = /data/mysql/mysql-error.log
slow_query_log = 1
slow_query_log_file = /data/mysql/mysql-slow.log
long_query_time = 1 # >1 秒记录慢 SQL
log_queries_not_using_indexes = 0 # 不建议开启,会爆日志
# ========== 临时表优化 ==========
tmp_table_size = 256M
max_heap_table_size = 256M
# ========== 排序 & JOIN 性能 ==========
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 4M
# ========== Binlog ==========
server-id = 1
log_bin = mysql-bin
binlog_format = row
sync_binlog = 1 # 最安全,性能弱;高 QPS 可设为 100~1000
expire_logs_days = 7
-
配置项:
innodb_flush_method -
作用: 控制数据和日志写入文件的方式。
-
优化建议:
- 在 Linux/Unix 系统上,推荐使用
O_DIRECT。它绕过操作系统的文件系统缓存,直接写入磁盘,避免双重缓存,提高性能和稳定性。 - 示例:
innodb_flush_method = O_DIRECT
- 在 Linux/Unix 系统上,推荐使用
-
配置项:
innodb_flush_log_at_trx_commit -
取值与含义:
0(性能最高): 每秒写入并刷新一次日志。有丢失一秒数据的风险。1(默认,最安全): 每次事务提交 都写入并刷新日志到磁盘。最安全,但 I/O 开销最大。2(折中): 每次提交写入日志,但只每秒刷新一次到磁盘。比1快,比0安全。
-
配置项:
sort_buffer_size -
作用: 用于处理需要排序的查询(如
ORDER BY或GROUP BY)。每个需要排序的连接都会分配这个大小的内存。 -
优化建议:
- 不应设置得太大 ,因为它分配给每个会话。
- 通常设置为 1MB 到 2MB。如果查询涉及大量排序,可以适当提高。
-
配置项:
join_buffer_size -
作用: 用于连接(JOIN)操作中无法使用索引时的缓冲区。
-
优化建议:
- 和
sort_buffer_size类似,也是每个连接分配。 - 通常设置为 128KB 到 1MB。
- 示例:
join_buffer_size = 512K
- 和
-
配置项:
table_open_cache -
作用: 设置表打开缓存的大小,减少打开表时的磁盘I/O
-
优化建议:: 设置为4096以提高表打开速度。
-
配置项:
open_files_limit -
作用: 决定了 MySQL 的文件 I/O 能力的边界
-
优化建议: 通常建议将 open_files_limit 设置为 table_open_cache 值的 两倍或更高,并预留一些空间给其他日志和连接使用。
- 操作系统限制:open_files_limit 的值不能超过操作系统为该用户或整个系统设置的硬性文件描述符限制(通过 ulimit -Hn 命令查看)。如果需要设置更大的值,您必须首先在操作系统的配置文件(如 /etc/security/limits.conf)中调整限制。
✅ 二、关键优化参数详细解释(必须理解)
以下是性能提升最大的一些配置。
1)innodb_buffer_pool_size(最重要)
InnoDB 的数据、索引都在这里缓存。
一般设置为机器内存 50%~70%。
| 服务器内存 | 建议设置 |
|---|---|
| 8GB | 4G--5G |
| 16GB | 8G--12G |
| 32GB | 16G--26G |
2)innodb_log_file_size(事务写性能关键)
- 默认只有几十 MB,非常低!
- 建议改成:
js
1G ~ 4G(取决于你的写入量)
好处:减少 checkpoint,提升写性能(电商退款 / 订单高并发很关键)
3)innodb_flush_log_at_trx_commit(最重要的性能与安全开关)
| 值 | 说明 | 性能 | 风险 |
|---|---|---|---|
| 1(默认) | 每次事务提交都写磁盘 | 最慢 | 最安全 |
| 2 | 写 OS buffer,1 秒刷盘 | ⭐ 很快 | 崩溃丢失 1 秒数据 |
| 0 | 延迟写日志 | ⭐ 超快 | 可能丢大量事务 |
你的场景(商城)推荐 1 或 2。
4)innodb_flush_method = O_DIRECT
防止双缓存(OS + MySQL),提升 IO 性能。
SSD 场景强烈推荐。
5)max_connections
很多项目默认只有 151,并发稍高立刻"Too many connections"。
一般:
js
2000(足够大部分互联网项目)
6)tmp_table_size & max_heap_table_size
避免复杂 SQL(group by、order by)频繁写磁盘:
js
256M 对大部分业务够用了
7)sort_buffer_size / join_buffer_size
不要设置太大!!每个连接都会分配!
4M 是一个非常安全的值。
8)sync_binlog(主从复制 / 容灾)
- 最安全:1
- 高吞吐:100~1000
你做电商退款、支付,建议:
js
sync_binlog = 1
binlog_format = row
保证 binlog 一致性,方便恢复。
✅ 三、常见优化场景建议
- 高读写电商系统(你的场景)
js
innodb_buffer_pool_size = 50%-70% 内存
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 4000
sync_binlog = 1
max_connections = 2000
- 高并发服务接口(订单、支付、库存)
js
join_buffer_size = 4M
sort_buffer_size = 4M
tmp_table_size = 256M
max_heap_table_size = 256M
✅ 四、完整优化策略总结(一句话理解)
MySQL 性能优化的核心:
让热数据都放在内存里,减少磁盘 IO,并减少每次事务刷盘次数