SQL执行计划是数据库引擎执行SQL语句时的具体步骤说明,能够直观展示语句的查询路径、索引使用、表关联方式等信息,是排查SQL性能问题的核心工具。掌握执行计划的查看和分析方法,能够帮助开发者快速定位慢查询的成因,针对性优化SQL逻辑或索引结构。

不同数据库查看执行计划的方法
MySQL数据库
MySQL中可以通过EXPLAIN关键字直接查看SELECT语句的执行计划,语法非常简单,只需要在待查询的SQL前加上EXPLAIN即可。如果是需要查看UPDATE、DELETE语句的执行计划,可以先转换成等价的SELECT语句再分析。
以下是一个简单的查询示例:
-- 查看用户表中年龄大于20的用户的执行计划 EXPLAIN SELECT id, name, age FROM user WHERE age > 20;
PostgreSQL数据库
PostgreSQL同样支持EXPLAIN关键字,还提供了EXPLAIN ANALYZE选项,该选项会实际执行SQL语句并返回真实的执行时间和行数,分析结果更贴近实际运行情况。
示例代码如下:
-- 只查看执行计划,不实际执行 EXPLAIN SELECT * FROM order WHERE order_id = 1001; -- 实际执行并返回真实运行数据 EXPLAIN ANALYZE SELECT * FROM order WHERE order_id = 1001;
Oracle数据库
Oracle中查看执行计划的方式更多,常用的有EXPLAIN PLAN FOR语句,执行后再查询PLAN_TABLE表获取结果,也可以使用自带的SQL Developer工具直接查看可视化执行计划。
命令行查看的示例:
-- 生成执行计划 EXPLAIN PLAN FOR SELECT ename, sal FROM emp WHERE deptno = 10; -- 查询执行计划结果 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
执行计划核心指标解读
不同数据库的执行计划输出字段略有差异,但核心指标的含义基本一致,以下是需要重点关注的内容:
- 查询类型(type):表示表的访问方式,常见的有ALL(全表扫描)、index(索引扫描)、range(范围扫描)、ref(非唯一索引匹配)、eq_ref(唯一索引匹配)、const(常量查询),性能从差到好依次排序。
- 可能使用的索引(possible_keys):表示SQL语句可能命中哪些索引。
- 实际使用的索引(key):表示最终执行时实际使用的索引,如果为NULL说明没有使用索引。
- 扫描行数(rows):表示数据库预估需要扫描的行数,数值越小说明查询效率越高。
- 额外信息(Extra):包含额外的执行说明,比如Using index表示覆盖索引,Using where表示需要回表过滤,Using filesort表示需要额外排序,Using temporary表示使用了临时表,这些都是需要优化的信号。
执行计划分析实战案例
以下是一个MySQL的执行计划分析示例,假设我们有一张订单表order_info,表结构包含id、user_id、order_status、create_time字段,其中id是主键,user_id上有普通索引。
执行以下查询语句:
EXPLAIN SELECT id, order_status FROM order_info WHERE user_id = 123 AND order_status = 1;
如果执行计划显示key为user_id,type为ref,rows为10,Extra为Using where,说明查询使用了user_id索引,扫描了10行数据,但是还需要回表过滤order_status条件。此时可以创建user_id和order_status的组合索引,让查询命中组合索引实现覆盖索引查询,减少回表操作,提升查询性能。
执行计划分析注意事项
分析执行计划时需要注意,执行计划中的行数都是预估值,和实际执行结果可能存在差异,对于复杂SQL建议使用EXPLAIN ANALYZE(如果数据库支持)获取真实执行数据。另外执行计划会受数据统计信息的影响,如果表的统计信息过期,可能导致执行计划选择错误的索引,此时需要更新表的统计信息后再分析。同时不要只看单个SQL的执行计划,还要结合业务场景分析SQL的调用频率,高频调用的慢SQL优先优化,能够带来更明显的性能提升。