EXPLAIN/ANALYZE、索引与 SQL 重写、关键配置入手给出系统化方法,并介绍性能观测工具。
优化流程速记
1
发现问题
通过慢查询日志、应用监控、APM 捕获耗时 SQL 或资源瓶颈。
2
定位根因
使用
EXPLAIN、performance_schema、系统指标分析问题来源。3
制定方案
从索引调整、SQL 重写、缓存策略与参数调优中选择最合适的手段。
4
验证与回归
在测试环境验证效果,再平滑上线并持续监测。
定位慢查询
mysqldumpslow、pt-query-digest(Percona),或使用云厂商/监控平台提供的慢日志分析。
线上变更全局变量前确认是否会影响其他实例;可优先设置
SET SESSION long_query_time = ... 对当前会话生效。执行计划与验证
type)、命中索引(key)、扫描行数(rows)、Extra 中是否 Using filesort/temporary。
可配合 optimizer_trace 深入理解优化器决策:
索引与 SQL 重写
- 避免
SELECT *,明确需要的列,争取覆盖索引 - 合理的复合索引顺序:高选择性列优先;与 WHERE、JOIN、ORDER BY 对齐
- 使用等值连接优先于子查询;必要时用
EXISTS替代IN - 分页优化:
WHERE id > ? ORDER BY id LIMIT n而非大量OFFSET - 使用虚拟列和功能性索引帮助命中表达式条件
关键参数参照
innodb_buffer_pool_size:通常设为物理内存的 50%~70%innodb_log_file_size:大事务场景适当增大,减少写入阻塞innodb_flush_log_at_trx_commit:1最安全;2/0性能更好但可能丢失 1 秒内事务max_connections:结合连接池使用,避免过大导致上下文切换query_cache_type/query_cache_size:MySQL 8.0 移除查询缓存,建议通过应用层缓存
观测与统计
performance_schema+sysschema:方便查看热点表/索引、语句摘要sys.schema_table_statistics:按表统计读写量sys.statement_analysis:按摘要查看平均/最大执行时间INFORMATION_SCHEMA.TABLE_STATISTICS:统计信息检查
资源瓶颈排查
- CPU 高:确认是否大量排序、哈希或全表扫描;考虑索引优化或拆分
- IO 高:检查缓冲池是否足够、是否存在大查询或备份任务
- 内存紧张:查看
SHOW ENGINE INNODB STATUS中缓冲池命中率 - 连接数暴涨:应用是否缺乏连接池、是否存在长事务
performance_schema.events_waits_summary_global_by_event_name 分析等待事件。
Profiling 与基线
performance_schema。在测试环境建立基准脚本(sysbench、自定义压测)持续追踪性能。
查询重写与缓存
- 通过应用层缓存(Redis、内存缓存)减少重复查询
- 使用物化视图策略:定时刷新统计表
- MySQL 8.0 引入的
CREATE VIEW仍为逻辑视图,注意查询展开成本 - 可以借助 ProxySQL 或 MySQL Router 实现读写分离与路由
持续优化建议
- 建立 SQL 审核流程:上线前通过工具检测危险语句
- 定期检查慢日志并打标签(业务模块、操作来源)
- 将指标接入监控平台(Prometheus、Grafana),设定告警阈值
小结
优化建立在度量与验证之上,借助慢日志、EXPLAIN ANALYZE 与合理索引能快速见效。持续监控与自动化分析可帮助你提前发现潜在问题。