一、硬件层面优化
二、配置文件调优
innodb_buffer_pool_size是InnoDB性能的关键参数,建议设置为服务器总内存的60%-70%(若主要为InnoDB表),用于缓存表数据和索引,减少磁盘访问。max_connections需根据应用并发需求设置(如500-1000),避免过多连接导致资源争抢;同时调整thread_cache_size(如16-32),缓存空闲线程,减少线程创建/销毁的开销。innodb_log_file_size设置为256M-512M(根据写入负载调整),增大日志文件可减少日志切换频率;innodb_flush_log_at_trx_commit设置为2(牺牲少量数据安全性换取性能),适用于对数据一致性要求不高的场景。vm.swappiness=0(或1),关闭Swap功能,避免内存不足时数据交换到磁盘,导致性能急剧下降。三、索引策略优化
CREATE INDEX idx_name ON table(column)),加速数据检索。WHERE col1=value1 AND col2=value2),创建复合索引(如CREATE INDEX idx_col1_col2 ON table(col1, col2)),覆盖查询所需的所有列,避免回表操作。SHOW INDEX FROM table检查并删除未使用的索引。WHERE YEAR(create_time)=2025),这会导致索引失效;使用EXPLAIN分析查询计划,确认是否使用了预期索引。四、查询语句优化
EXPLAIN SELECT ...查看查询执行计划,重点关注type(访问类型,如ref、range优于ALL)、rows(扫描行数,越少越好)、Extra(是否有Using filesort、Using temporary等性能问题)。SELECT id, name FROM table),减少数据传输量和内存占用。LIMIT 10000, 10),使用WHERE id > last_id LIMIT 10(基于上一页最后一条记录的ID),避免OFFSET的大偏移量扫描。SELECT a.* FROM table1 a JOIN table2 b ON a.id=b.a_id WHERE b.status=1),子查询可能导致临时表创建,降低性能。五、定期维护操作
OPTIMIZE TABLE table_name(针对InnoDB表,可整理碎片、回收空间,提升查询效率),尤其适用于频繁插入、删除数据的表。slow_query_log)和二进制日志(binlog),释放磁盘空间;可通过PURGE BINARY LOGS BEFORE '2025-01-01';删除旧日志。ANALYZE TABLE table_name更新表的统计信息,帮助查询优化器生成更优的执行计划(如选择正确的索引)。六、缓存策略优化
query_cache_size,如64M;query_cache_type=1)可缓存SELECT查询结果,适用于读多写少的场景(注意:MySQL 8.0及以上已移除查询缓存,需使用其他缓存方案)。七、监控与调优
slow_query_log=1;long_query_time=2,单位秒;slow_query_log_file=/var/log/mysql/slow-queries.log),定期分析执行时间超过阈值的查询,针对性优化。