如何查看数据库的执行计划?

wen IT资讯 239

本文目录导读:

如何查看数据库的执行计划?

  1. MySQL
  2. PostgreSQL
  3. Oracle
  4. SQL Server
  5. SQLite
  6. 执行计划关键指标解读
  7. 实践建议

查看数据库的执行计划是数据库性能调优的核心技能,不同的数据库系统有不同的查看方式,下面分别介绍最常见的几种。

MySQL

使用 EXPLAIN

-- 查看查询的执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;
-- 更详细的输出(支持 JSON 格式)
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 25;
-- 实际执行并显示执行计划
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;

输出字段含义:

  • id:查询的标识符
  • select_type:查询类型(SIMPLE、PRIMARY、SUBQUERY 等)
  • table:涉及的表
  • type:访问类型(ALL、index、range、ref、eq_ref、const、system)
  • possible_keys:可能使用的索引
  • key:实际使用的索引
  • rows:估计扫描的行数
  • Extra:额外信息(Using index、Using filesort 等)

PostgreSQL

使用 EXPLAIN

-- 基本执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;
-- 包含实际执行时间和行数
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;
-- 查看缓冲区使用情况
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE age > 25;
-- JSON 格式输出
EXPLAIN (FORMAT JSON) SELECT * FROM users WHERE age > 25;

使用 pgAdmin 图形界面

  1. 打开查询工具
  2. 编写 SQL 语句
  3. 点击 "解释""分析" 按钮
  4. 查看图形化的执行计划

Oracle

使用 EXPLAIN PLAN

-- 生成执行计划到 PLAN_TABLE
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE salary > 5000;
-- 查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

使用自动跟踪

-- 启用自动跟踪
SET AUTOTRACE ON;
-- 执行查询
SELECT * FROM employees WHERE salary > 5000;
-- 关闭自动跟踪
SET AUTOTRACE OFF;

使用 SQL Developer

  1. 打开 SQL 工作表
  2. 编写 SQL
  3. F10 或点击 "解释执行计划" 图标

SQL Server

使用 SET SHOWPLAN

-- 只显示执行计划,不执行查询
SET SHOWPLAN_XML ON;
GO
SELECT * FROM users WHERE age > 25;
GO
SET SHOWPLAN_XML OFF;
GO
-- 显示实际执行计划
SET STATISTICS PROFILE ON;
GO
SELECT * FROM users WHERE age > 25;
GO
SET STATISTICS PROFILE OFF;
GO

使用 SSMS 图形界面

  1. 在查询编辑器中编写 SQL
  2. 点击 "显示估计的执行计划"(快捷方式:Ctrl+L)
  3. 或点击 "包含实际的执行计划"(快捷方式:Ctrl+M)

SQLite

-- 查看执行计划
EXPLAIN QUERY PLAN
SELECT * FROM users WHERE age > 25;

执行计划关键指标解读

无论使用哪种数据库,都要关注以下几点:

指标 含义 理想情况
扫描方式 TABLE SCAN(全表扫描) vs INDEX SCAN(索引扫描) 尽量索引扫描
预估行数 预计扫描的记录数 越小越好
连接方式 Nested Loop vs Hash Join vs Merge Join 根据数据量选择
排序操作 是否需要排序 尽量利用索引避免排序
临时表 是否创建临时表 尽量避免

实践建议

  1. 先看 type 字段:出现 ALL(全表扫描)通常需要优化
  2. 关注 rowsExtra
    • 大量 rows 扫描但 Extra 显示 Using filesort → 需要优化排序
    • Using temporary → 可能产生临时表,注意性能
  3. 对比不同索引:通过 possible_keyskey 判断索引是否被正确使用
  4. 使用 ANALYZE:实际执行后的执行计划更准确,但要注意对生产环境的影响

需要针对具体的慢查询帮助分析执行计划吗?

抱歉,评论功能暂时关闭!