一、硬件资源优化
硬件是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(针对频繁更新的表)、每月重建索引(针对碎片化严重的表),保持数据库健康。