慢SQL优化
慢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
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
需要查询的行数
索引优化
确保查询条件列和排序字段都有适当索引
查询优化
对于复杂查询,考虑拆分为多个简单查询