慢 SQL 通常指执行时间超过预设阈值的查询语句。不同业务场景对"慢"的定义可能不同,例如电商系统可能将超过 200ms 的查询视为慢查询,而数据分析系统可能将超过 5 秒的查询才视为慢查询。
工具监控
数据库系统通常提供内置的监控工具,如 MySQL 的慢查询日志和 Performance Schema。
慢查询日志需要配置 long_query_time 参数来定义阈值,记录执行时间超过该值的查询。Performance Schema 能提供更详细的性能数据,包括查询执行时间、锁等待时间等指标。
1)查看 Performance Schema 的配置信息
1 |
|
2)查看 Performance Schema 的监控项:
1 |
|
3)查看 Performance Schema 收集的性能数据:
1 |
|
分析慢 SQL
explain
https://segmentfault.com/a/1190000023565685
|
|
select_type:
- SIMPLE 简单查询,不包括子查询和
union查询- PRIMARY 当存在子查询时,最外面的查询被标记为主查询
SUBQUERY子查询partitions:
- 分区表命中的分区情况
type:
- 可能的几种值:NULL > system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL,越是靠左越好,
NULL说明能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引,那么不查询索引也不查询表那你的数据是从哪里来的啊?如 select 5*7,是不需要查数据的,SELECT MAX(id) FROM table,MySQL 会直接到你的索引的分叶子节点上直接拿,所以不用访问表或者索引。ref则是单表扫描或者连接。ref_or_null类似 ref,但是可以搜索值为NULL的行。index_merge表示查询使用了两个以上的索引。range索引范围查询。indexindex只遍历索引树,通常比All快。possible_key:
- 可能会使用的索引
key:
- 实际会使用的索引
rows
- 需要查询的行数
索引优化
确保查询条件列和排序字段都有适当索引
查询优化
对于复杂查询,考虑拆分为多个简单查询