2.SQL语句执行慢,如何分析
上一篇咱们提到了,慢查询的主要四种情况:
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
如果需要对慢查询进行分析,可以使用数据库提供的工具查看SQL的执行计划。
我们来说一下什么是 “检查执行计划”。
检查执行计划
使用数据库提供的工具查看SQL的执行计划。例如在MySQL中可以使用
EXPLAIN
命令,Oracle中可以使用EXPLAIN PLAN FOR
。执行计划会显示SQL语句是如何执行的,包括使用的索引、表连接顺序等信息。
常见数据库查看执行计划的方法
MySQL
-- 基本执行计划
EXPLAIN SELECT * FROM users WHERE id = 100;-- 更详细的执行信息(实际执行查询)
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 100;
Oracle
-- 生成执行计划
EXPLAIN PLAN FOR SELECT * FROM users WHERE id = 100;-- 查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
SQL Server
-- 文本格式执行计划
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM users WHERE id = 100;
GO
SET SHOWPLAN_TEXT OFF;
GO-- 图形化执行计划(在SSMS中)
-- 点击"包含实际执行计划"按钮后执行查询
PostgreSQL
-- 基本执行计划
EXPLAIN SELECT * FROM users WHERE id = 100;-- 带实际执行统计的执行计划
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 100;
执行计划的结果
执行:
EXPLAIN SELECT * FROM users WHERE id = 100
结果如下:
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | users | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
输出字段解释(黄色是重要信息):
字段 说明 id 查询中SELECT的序列号,id相同表示同一层级执行,id越大优先级越高 select_type 查询类型:
- SIMPLE:简单查询(无子查询或UNION)
- PRIMARY:主查询
- SUBQUERY:子查询
- DERIVED:派生表(FROM子句中的子查询)
- UNION:UNION中的第二个或后面的查询table 访问的表名或别名 partitions 匹配的分区 type 访问类型(性能关键指标),从好到坏:
- system > const > eq_ref > ref > range > index > ALL
ALL表示全表扫描,通常需要优化possible_keys 可能使用的索引 key 实际使用的索引 key_len 使用的索引长度 ref 显示索引的哪一列被使用 rows 预估需要读取的行数 filtered 表示存储引擎返回的数据在server层过滤后剩余的比例 Extra 额外信息:
- Using index:覆盖索引
- Using where:使用了WHERE过滤
- Using temporary:使用临时表
- Using filesort:需要额外排序
上一篇