1. 硬件优化
硬件是数据库性能的基础,需优先满足以下需求:
innodb_buffer_pool_size需占用大部分内存);innodb_thread_concurrency参数需根据CPU核心数调整)。2. 操作系统优化
调整系统内核参数,优化系统资源分配:
/etc/fstab文件,注释掉Swap分区行(或使用swapoff -a命令),避免内存不足时频繁换页,导致性能骤降;/etc/security/limits.conf,增加mysql soft nofile 65535和mysql hard nofile 65535,提升MySQL处理高并发连接的能力;/etc/sysctl.conf,添加net.ipv4.tcp_tw_reuse = 1(重用TIME_WAIT连接)、net.ipv4.tcp_fin_timeout = 30(缩短连接关闭等待时间),提升网络连接效率。3. MySQL配置文件优化(/etc/mysql/my.cnf或/etc/my.cnf)
根据服务器资源调整关键参数,平衡性能与稳定性:
innodb_buffer_pool_size = 70%~80% of total RAM(InnoDB的核心缓存,用于存储数据和索引,是提升性能的关键参数);innodb_log_file_size = 256M~1G(增大日志文件大小,减少日志切换频率,提升写入性能)、innodb_flush_log_at_trx_commit = 2(平衡性能与数据安全性,每秒刷新日志到磁盘,适用于对数据一致性要求稍低的场景);max_connections = 500~1000(根据实际并发需求设置,避免过多连接导致内存耗尽)、thread_cache_size = 50~100(缓存空闲线程,减少线程创建/销毁的开销);tmp_table_size = 64M~256M、max_heap_table_size = 64M~256M(限制临时表内存使用,避免大临时表占用过多内存导致磁盘临时表产生);table_open_cache = 2000~4000(缓存表结构信息,减少频繁打开表的开销)、table_definition_cache = 1000~2000(缓存表定义信息,提升表访问效率)。4. 查询优化
通过优化SQL语句,减少数据库负载:
WHERE、JOIN、ORDER BY的列创建索引(如CREATE INDEX idx_column ON table_name(column)),避免全表扫描;SELECT id, name FROM users),减少数据传输量和内存占用;EXPLAIN SELECT ...命令查看查询执行计划,识别全表扫描、索引失效等问题(重点关注type列是否为ref或range,key列是否使用了索引);ON a.id = b.user_id中a.id和b.user_id都有索引),减少JOIN的计算量;LIMIT offset, size的深度分页问题(如offset=100000时性能差),可使用WHERE id > last_id LIMIT size(last_id为上一页最后一条记录的ID)或延迟关联(先通过索引获取ID,再关联查询详细信息)。5. 数据库结构优化
合理的表结构设计能提升查询效率和可维护性:
PARTITION BY RANGE (YEAR(create_time))),将数据分散到多个物理文件中,提升查询和维护效率;archive_users),减少主表的大小,提升查询速度。6. 定期维护
保持数据库健康状态,避免性能退化:
OPTIMIZE TABLE table_name命令整理表碎片(InnoDB表会重建表空间,回收未使用的空间),适用于频繁插入、删除数据的表;ANALYZE TABLE table_name命令更新统计信息(如表中数据分布变化较大时);/var/log/mysql/slow_queries.log)和错误日志(/var/log/mysql/error.log),避免日志文件过大占用磁盘空间(可使用logrotate工具自动轮转日志)。7. 监控与工具使用
通过监控工具实时掌握数据库性能状态,及时发现问题:
slow_query_log = 1,设置long_query_time = 2(超过2秒的查询视为慢查询),定期分析慢查询日志找出性能瓶颈;Percona Monitoring and Management (PMM)、Prometheus + Grafana等工具,监控MySQL的关键指标(如QPS、TPS、连接数、缓冲池命中率、查询响应时间),设置告警阈值(如缓冲池命中率低于90%时触发告警);pt-query-digest分析慢查询日志(生成详细的查询报告,包括查询频率、执行时间、锁等待时间),帮助定位问题查询。