慢 SQL 排查不要只盯索引
慢 SQL 排查不要只盯索引
遇到慢 SQL,很多人的第一反应是加索引。索引当然重要,但慢查询不一定只是索引问题。查询目标不清、返回字段太多、分页方式不合适、业务调用过于频繁,都可能让 SQL 变慢。
先看查询目的
排查前先问这个 SQL 想解决什么问题。是列表查询、详情查询、统计查询,还是后台导出。不同目标对返回字段、排序方式、实时性和数据范围的要求不一样。
如果一个列表页只展示少量字段,却查询了完整大对象,问题可能不在索引,而在接口设计过重。
再看数据范围
慢 SQL 经常和数据范围有关。没有时间条件、没有状态条件、模糊搜索范围过大、排序字段不合适,都会让数据库做很多不必要的工作。
排查时要结合执行计划、筛选条件、排序字段和返回行数一起看。只看 SQL 文本,很容易误判。
最后看调用方式
有些 SQL 单次执行并不慢,但被循环调用后整体就慢了。典型问题是列表查询后逐条查详情,或者每条数据再查关联信息。
这种情况更应该优化调用方式,比如批量查询、提前聚合、减少不必要字段,而不是盲目给每个查询都加索引。
复盘
慢 SQL 排查要从业务目的出发,再到数据范围、执行计划和调用方式。索引是重要工具,但不是唯一答案。真正的优化是让数据库少做无效工作。
参考
- MySQL EXPLAIN 文档:https://dev.mysql.com/doc/refman/en/explain.html
- MySQL 优化器文档:https://dev.mysql.com/doc/refman/en/optimizer-optimization.html