MySQL的性能优化。
一、硬件与系统层面调优
存储优化
- 使用 SSD 替代 HDD,提升随机 IO 性能(尤其适合 InnoDB 存储引擎)。
- 配置独立的磁盘存储数据文件、日志文件(避免 IO 竞争)。
内存配置
- 分配足够内存给 MySQL 缓存(如 InnoDB Buffer Pool),减少磁盘 IO。
- 合理设置操作系统的虚拟内存和文件系统缓存(如
vm.swappiness
调至 10 以下,减少 swap 使用)。
CPU 优化
- 选择多核 CPU(MySQL 对多核支持较好),避免单线程瓶颈。
- 关闭不必要的 CPU 节能模式,保证性能稳定性。
二、MySQL 参数优化(my.cnf/my.ini)
InnoDB 核心参数
innodb_buffer_pool_size
:建议设置为物理内存的 50%-70%,用于缓存数据页和索引,减少磁盘访问。innodb_log_buffer_size
:默认 16M,大事务场景可增至 64M-128M,减少 redo log 刷盘次数。innodb_flush_log_at_trx_commit
:- 1(默认):事务提交时立即刷 redo log 到磁盘,最安全但性能略低。
- 0:每秒刷盘一次,性能高但可能丢失 1 秒数据。
innodb_read_io_threads
/innodb_write_io_threads
:IO 线程数,默认 4,高 IO 场景可增至 8-16。innodb_file_per_table
:开启(默认 ON),每张表使用独立表空间,避免共享表空间膨胀。
连接与缓存参数
max_connections
:最大连接数,根据业务需求设置(默认 151,过高可能占用过多内存)。wait_timeout
/interactive_timeout
:空闲连接超时时间,避免连接泄露(如设置 300 秒)。query_cache_size
:查询缓存(MySQL 8.0 已移除),低版本中若频繁更新数据建议禁用(设为 0)。
日志参数
slow_query_log
:开启慢查询日志,记录执行时间超过long_query_time
(如 1 秒)的 SQL,用于优化。binlog_cache_size
:二进制日志缓存,大事务场景可适当调大。
三、索引优化
创建合适的索引
- 对 WHERE、JOIN、ORDER BY、GROUP BY 涉及的字段建立索引。
- 避免过度索引(索引会降低写入性能,增加存储空间)。
- 使用联合索引时遵循 “最左前缀原则”(如
(a,b,c)
索引,能匹配a
、a+b
、a+b+c
查询)。
避免索引失效
- 不使用
SELECT *
,只查询必要字段(减少回表操作)。 - 避免在索引字段上使用函数(如
SUBSTR(name,1,3)
)、计算(如price+1
)或类型转换。 - 避免使用
NOT IN
、!=
、IS NOT NULL
(可能导致全表扫描)。
- 不使用
四、SQL 语句优化
优化慢查询
- 通过
EXPLAIN
分析 SQL 执行计划,查看是否使用索引、是否全表扫描(type=ALL
)。 - 拆分复杂 SQL(如大 JOIN 拆分为多个小查询),避免长时间锁表。
- 分页查询优化:使用
LIMIT
时搭配索引定位(如WHERE id > 1000 LIMIT 10
),避免LIMIT 1000000, 10
的低效写法。
- 通过
减少锁冲突
- 避免长事务(事务持锁时间越长,冲突概率越高)。
- 批量操作拆分(如批量插入用
INSERT INTO ... VALUES (...), (...)
代替循环插入)。 - 合理使用事务隔离级别(非必要不使用
SERIALIZABLE
)。
五、表结构与存储引擎优化
表结构设计
- 选择合适的数据类型(如用
INT
代替BIGINT
,VARCHAR(n)
代替CHAR(n)
节约空间)。 - 避免使用
TEXT
/BLOB
存储大字段,可单独拆分表。 - 分表分库:大表(千万级以上)按时间、ID 等维度拆分(如水平分表、垂直分表)。
- 选择合适的数据类型(如用
存储引擎选择
- 优先使用 InnoDB(支持事务、行级锁、MVCC,适合高并发读写)。
- 只读场景可用 MyISAM(不支持事务,但读性能略高)。
六、架构层面优化
读写分离
- 主库负责写操作,从库负责读操作(通过 binlog 同步数据),分散单库压力。
缓存策略
- 引入 Redis 等缓存中间件,缓存热点数据(如用户信息、商品详情),减少数据库访问。
集群与负载均衡
- 使用 MySQL Cluster 或主从复制 + Proxy(如 ProxySQL)实现高可用和负载均衡。
七、监控与持续优化
- 工具:使用
SHOW PROCESSLIST
查看当前连接,SHOW ENGINE INNODB STATUS
分析 InnoDB 状态,Performance Schema
监控细粒度性能指标。 - 定期:分析慢查询日志、优化索引、清理冗余数据、检查表碎片(
OPTIMIZE TABLE
)。
总结
MySQL 性能调优的核心是减少磁盘 IO、降低锁冲突、提高缓存利用率,需要结合业务场景(读多写少 / 写多读少)、数据量和并发量综合调整。优先解决瓶颈(如慢查询、索引缺失),再逐步优化参数和架构,避免盲目调优。