怎么查看数据库的执行计划
- 数据库
- 2025-09-01
- 4
EXPLAIN 关键字,在 SQL 查询前加上
EXPLAIN,如 `EXPLAIN SELECT FROM table_name;
数据库管理和优化过程中,查看数据库的执行计划是一项非常重要的任务,执行计划(也称为查询计划或访问计划)是数据库管理系统(DBMS)生成的一个详细步骤列表,描述了如何执行一个SQL查询,通过分析执行计划,可以了解查询的性能瓶颈,并进行相应的优化,以下是如何查看不同数据库系统中执行计划的详细方法。
MySQL
使用 EXPLAIN 关键字
在MySQL中,可以使用 EXPLAIN 关键字来查看SQL查询的执行计划。EXPLAIN 会返回一张表,其中包含了查询执行的详细信息。
示例:
EXPLAIN SELECT FROM employees WHERE employee_id = 1;
输出示例:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|—-|————-|————|————|——-|—————|————–|———|——|——|———|————————-|
| 1 | SIMPLE | employees | NULL | const | PRIMARY | PRIMARY | 4 | const| 1 | 100.00 | Using where; Using index |
字段解释:
- id: 查询中每个子查询的唯一标识符。
- select_type: 查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询)、UNION(联合查询)等。
- table: 查询的表名。
- partitions: 查询的分区信息(如果适用)。
- type: 连接类型,如const、eq_ref、ref、range、index、ALL等。
const表示最优,ALL表示全表扫描。 - possible_keys: 可能使用的索引。
- key: 实际使用的索引。
- key_len: 使用索引的长度。
- ref: 索引列的比较对象。
- rows: 估计需要读取的行数。
- filtered: 估计的行过滤比例。
- Extra: 额外的信息,如Using where、Using index等。
使用 EXPLAIN ANALYZE 关键字
在MySQL 8.0.18及以上版本中,可以使用 EXPLAIN ANALYZE 来获取更详细的执行计划,包括实际执行的时间和行数。
示例:
EXPLAIN ANALYZE SELECT FROM employees WHERE employee_id = 1;
PostgreSQL
使用 EXPLAIN 关键字
在PostgreSQL中,可以使用 EXPLAIN 关键字来查看SQL查询的执行计划,与MySQL类似,EXPLAIN 会返回一个详细的步骤列表。
示例:
EXPLAIN SELECT FROM employees WHERE employee_id = 1;
输出示例:
QUERY PLAN
-------------------------------------------------------------------
Seq Scan on employees (cost=0.00..1.50 rows=1 width=32) (actual time=0.010..0.011 rows=1 loops=1)
Filter: (employee_id = 1)
Rows Removed by Filter: 999999
Planning time: 0.067 ms
Execution time: 0.053 ms
字段解释:
- Seq Scan: 顺序扫描。
- cost=0.00..1.50: 预计的启动成本和总成本。
- rows=1: 预计返回的行数。
- width=32: 每行的字节数。
- actual time=0.010..0.011: 实际执行时间。
- Filter: 过滤条件。
- Rows Removed by Filter: 被过滤掉的行数。
- Planning time: 查询规划时间。
- Execution time: 查询执行时间。
使用 EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) 关键字
在PostgreSQL中,可以使用 EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) 来获取更详细的执行计划,包括实际执行的时间和行数,以及缓冲区的使用情况。
示例:
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT FROM employees WHERE employee_id = 1;
SQL Server
使用 DISPLAYPLAN 或 SHOWPLAN_ALL
在SQL Server中,可以使用 DISPLAYPLAN 或 SHOWPLAN_ALL 来查看SQL查询的执行计划。
示例:
SET SHOWPLAN_ALL ON; GO SELECT FROM employees WHERE employee_id = 1; GO SET SHOWPLAN_ALL OFF; GO
输出示例:
| --Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[employee_id],0)))
|--Table Spool
|--Clustered Index Seek(OBJECT:([employees].[PK_employees]), SEEK:([employee_id]=[@1]) ORDERED FORWARD)
使用 Query Analyzer 或 SQL Server Management Studio (SSMS)
在SQL Server Management Studio (SSMS)中,可以通过点击“显示实际执行计划”按钮来查看查询的执行计划,执行计划会以图形化的方式显示,便于理解。
Oracle
使用 EXPLAIN PLAN 关键字
在Oracle中,可以使用 EXPLAIN PLAN 关键字来查看SQL查询的执行计划,与MySQL和PostgreSQL不同,Oracle的 EXPLAIN PLAN 不会直接返回结果,而是将执行计划存储在一个名为 PLAN_TABLE 的表中。
示例:
EXPLAIN PLAN FOR SELECT FROM employees WHERE employee_id = 1; SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);
输出示例:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|----|-----------------------|--------------|-------|-------|-----------|----------|
| 0 | SELECT STATEMENT | | 1 | 32 | 2 (100) | 00:00:01 |
| 1 | TABLE ACCESS BY INDEX| EMPLOYEES | 1 | 32 | 2 (100) | 00:00:01 |
| 2 | INDEX UNIQUE SCAN | SYS_C0012345 | 1 | | 1 (50) | 00:00:01 |
使用 AUTOTRACE 工具
在Oracle中,可以使用 AUTOTRACE 工具来查看SQL查询的执行计划和统计信息。AUTOTRACE 会自动显示查询的执行计划和统计信息。
示例:
SET AUTOTRACE ON; SELECT FROM employees WHERE employee_id = 1;
SQLite
使用 EXPLAIN 关键字
在SQLite中,可以使用 EXPLAIN 关键字来查看SQL查询的执行计划,SQLite的执行计划相对简单,但仍然提供了足够的信息来理解查询的执行过程。
示例:
EXPLAIN SELECT FROM employees WHERE employee_id = 1;
输出示例:
QUERY PLAN
`--SEARCH TABLE employees USING INDEX employee_id (=?)
查看数据库的执行计划是数据库优化的重要步骤,不同的数据库系统提供了不同的工具和方法来查看执行计划,通过分析执行计划,可以了解查询的性能瓶颈,并进行相应的优化,如添加索引、调整查询结构等,掌握如何查看和分析执行计划,对于数据库管理员和开发人员来说是非常重要的技能。
FAQs
问题1:什么是执行计划?
答:执行计划是数据库管理系统(DBMS)生成的一个详细步骤列表,描述了如何执行一个SQL查询,它包括了查询的各个阶段、使用的索引、估计的行数等信息,通过分析执行计划,可以了解查询的性能瓶颈,并进行相应的优化。
问题2:为什么需要查看执行计划?
答:查看执行计划可以帮助我们了解SQL查询的执行过程,识别性能瓶颈,如全表扫描、索引缺失等,通过分析执行计划,可以优化查询结构、添加或调整索引,从而提高查询性能。
