数据库往往是性能瓶颈的高发区域。本文分享一套系统化的MySQL性能优化方法论。
第一步:开启慢查询日志
首先确认慢查询日志已正确配置:
- long_query_time设置为合理的阈值(建议1-2秒)
- log_queries_not_using_indexes记录全表扫描
- 使用pt-query-digest工具聚合分析
第二步:EXPLAIN分析执行计划
对于每条慢查询,使用EXPLAIN查看执行计划,重点关注:
- type列:ALL(全表扫描)需要优化,range/ref/const是较好的访问方式
- rows列:预估扫描行数,数值越大越需要优化
- Extra列:Using filesort和Using temporary是需要关注的信号
第三步:索引设计原则
- 最左前缀原则:联合索引中,查询条件必须从最左列开始
- 高选择性优先:选择性高的列放在联合索引前面
- 覆盖索引:查询列都在索引中,避免回表
- 避免冗余索引:定期使用sys.schema_unused_indexes检查
第四步:SQL改写
- 避免SELECT *,只查询需要的列
- 分页优化:使用延迟关联或游标分页替代OFFSET
- 子查询优化为JOIN
- 合理使用批量插入
实战案例
某订单查询接口P99响应时间达到8秒,通过分析发现: 1. 缺失关键索引,每次全表扫描300万行 2. 添加(created_at, status)联合索引后扫描行数降至500行 3. 接口P99响应时间降至120ms
优化效果立竿见影,也验证了"80%的性能问题来自数据库"这一经验法则。
标签:MySQL慢查询索引优化数据库性能