常用数据库查看SQL执行计划的方法( Mysql,Oracle,Postgresql,SQL Server,SQLite)
执行计划(Execution Plan)是数据库如何执行SQL语句的详细路线图,了解如何查看执行计划对优化查询性能至关重要。以下是主流数据库查看执行计划的方法:
1. MySQL/MariaDB
基本方法
-- 常规EXPLAIN
EXPLAIN SELECT * FROM users WHERE age > 25;
-- 更详细的分析(MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;
输出解读重点:
type:访问类型(从好到差:system > const > eq_ref > ref > range > index > ALL)
key:实际使用的索引
rows:预估需要检查的行数
Extra:额外信息(如Using where, Using index, Using filesort等)
2. PostgreSQL
-- 简单执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;
-- 带实际执行统计
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;
-- 更详细格式
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT * FROM users WHERE age > 25;
输出解读重点:
Seq Scan vs Index Scan:全表扫描还是索引扫描
Cost:预估成本(第一个数字是启动成本,第二个是总成本)
Actual Time:实际执行时间
Buffers:缓存使用情况
3. Oracle
-- 生成执行计划
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;
-- 查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 带统计信息的执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id => 'abc123', format => 'ALLSTATS LAST'));
输出解读重点:
Operation:执行的操作(如TABLE ACCESS FULL, INDEX RANGE SCAN)
Name:操作的对象(表或索引名)
Rows:预估行数
Cost:预估成本
Time:预估执行时间
4. SQL Server
-- 文本格式执行计划
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM users WHERE age > 25;
GO
SET SHOWPLAN_TEXT OFF;
-- 图形化执行计划(SSMS中)
-- 按Ctrl+M打开实际执行计划,然后执行查询
-- XML格式执行计划
SET SHOWPLAN_XML ON;
GO
SELECT * FROM users WHERE age > 25;
GO
SET SHOWPLAN_XML OFF;
输出解读重点:
Physical Operation:物理操作(如Clustered Index Scan, Index Seek)
Logical Operation:逻辑操作
Estimated I/O Cost:预估I/O成本
Estimated Subtree Cost:子树总成本
Actual Rows vs Estimated Rows:实际与预估行数对比
5. SQLite
-- 简单执行计划
EXPLAIN QUERY PLAN SELECT * FROM users WHERE age > 25;
-- 更详细的字节码执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;
输出解读重点:
detail:执行细节
scan:扫描方式(如TABLE, INDEX)
using index:是否使用索引
通用执行计划解读技巧
从右向左,从内向外阅读执行计划
重点关注:
全表扫描(TABLE SCAN/FULL SCAN)
高成本操作
预估行数与实际行数差异大的步骤
寻找性能瓶颈:
最昂贵的操作(最高成本或最长时间)
未使用预期索引的情况
不必要的排序或临时表操作