慢SQL优化思路

慢 SQL 通常指执行时间超过预设阈值的查询语句。不同业务场景对"慢"的定义可能不同,例如电商系统可能将超过 200ms 的查询视为慢查询,而数据分析系统可能将超过 5 秒的查询才视为慢查询。

工具监控

数据库系统通常提供内置的监控工具,如 MySQL 的慢查询日志和 Performance Schema。

慢查询日志需要配置 long_query_time 参数来定义阈值,记录执行时间超过该值的查询。Performance Schema 能提供更详细的性能数据,包括查询执行时间、锁等待时间等指标。

1)查看 Performance Schema 的配置信息

1

SHOW VARIABLES LIKE 'performance_schema%'

2)查看 Performance Schema 的监控项:

1

SELECT * FROM performance_schema.setup_instruments

3)查看 Performance Schema 收集的性能数据:

1

SELECT * FROM performance_schema.events_statements_summary_by_digest

分析慢 SQL

explain

https://segmentfault.com/a/1190000023565685

1
2
3
4
5
6
explain select * from user;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   23 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
  • 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  索引范围查询。index index只遍历索引树,通常比All快。
  • possible_key:

    • 可能会使用的索引
  • key:

    • 实际会使用的索引
  • rows

    • 需要查询的行数

索引优化

确保查询条件列和排序字段都有适当索引

查询优化

对于复杂查询,考虑拆分为多个简单查询

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计