一、硬件资源优化
硬件是MySQL性能的基础,需根据服务器负载合理配置:
二、操作系统层面优化
操作系统配置直接影响MySQL资源利用率:
vm.swappiness
(建议设为10以下,减少内存交换)、vm.dirty_background_ratio
(脏页刷新阈值,建议10-20%)、tcp_tw_reuse
(启用TIME-WAIT复用)等参数,提升内存与网络效率。async
(异步I/O)、noatime
(禁用访问时间更新)等参数,减少文件系统开销。numactl --interleave=all
),避免内存访问延迟。三、MySQL配置优化
配置参数需根据服务器内存、CPU核心数及业务场景调整:
innodb_buffer_pool_size
:InnoDB核心内存区域,用于缓存数据与索引,建议设置为物理内存的50%-80%(如64GB内存设为32-51.2GB)。key_buffer_size
:MyISAM索引缓存,若使用InnoDB可设为256M-512M(InnoDB对MyISAM索引支持有限)。table_open_cache
:表缓存,建议设置为16384-32768,减少表打开/关闭次数。max_connections
:根据并发用户数设置(如1000-2000),避免连接数耗尽导致拒绝服务;需配合thread_cache_size
(缓存线程,建议64-256)使用,减少线程创建/销毁开销。innodb_thread_concurrency
:InnoDB线程并发数,建议设为CPU核心数的2倍(如8核设为16),避免线程争抢。innodb_log_file_size
:InnoDB重做日志大小,建议256M-512M(增大日志文件可减少日志切换频率,提升写入性能)。innodb_flush_log_at_trx_commit
:日志刷新策略,主库设为1(保证数据安全),从库设为2(提升性能,允许丢失1秒数据)。四、SQL语句优化
慢查询是性能瓶颈的主要来源,需通过工具与技巧优化:
slow_query_log
(记录执行时间超过阈值的SQL),使用pt-query-digest
或EXPLAIN
分析查询计划,定位全表扫描、未使用索引等问题。WHERE
、JOIN
、ORDER BY
子句中的列)创建索引,避免过度索引(每个索引会增加写操作开销)。(user_id, create_time)
),遵循最左前缀原则(查询条件需包含复合索引的最左列)。WHERE YEAR(create_time) = 2025
),会导致索引失效。SELECT *
,仅选择所需字段(减少数据传输量)。JOIN
代替子查询(JOIN
通常更高效,尤其是关联大表时)。LIMIT offset, size
(如LIMIT 10000, 10
),可使用WHERE id > last_id LIMIT size
(基于上一页最后一条记录的ID查询,减少扫描行数)。五、表结构优化
合理的表结构设计能减少数据冗余与查询开销:
INT
代替BIGINT
、VARCHAR(50)
代替TEXT
),避免使用TEXT
、BLOB
等大字段(可将大字段分离到单独表中)。JOIN
操作;反规范化(如添加冗余字段)可减少JOIN
,但需权衡数据一致性(根据业务需求选择)。RANGE
、哈希HASH
分区),提升查询效率(查询时可只扫描特定分区)。六、索引优化
索引是提升查询性能的关键,需合理设计与管理:
(a, b, c)
索引可用于WHERE a=1
、WHERE a=1 AND b=2
,但不能用于WHERE b=2
)。SELECT user_id FROM orders WHERE user_id = 1
,若user_id
有索引,可直接从索引获取数据,无需回表),减少I/O开销。OPTIMIZE TABLE
重建索引(消除碎片,提升索引效率);删除冗余索引(如重复索引、未使用的索引)。七、缓存策略
利用缓存减少数据库直接访问压力:
query_cache_size
(MySQL 8.0已移除,建议使用应用层缓存),避免高并发下缓存成为瓶颈。八、监控与维护
持续监控与维护是保持性能稳定的关键:
OPTIMIZE TABLE
(针对频繁更新的表)、每月重建索引(针对碎片化严重的表),保持数据库健康。