EXPLAIN PLAN的核心指标包括操作类型、行数、成本和额外信息。操作类型揭示数据访问方式,如全表扫描或索引扫描;行数反映处理数据量,过高可能意味着效率问题;成本是资源消耗的相对估算,用于识别性能瓶颈;额外信息提示关键问题,如Using filesort或Using temporary,表明排序或临时表使用,需优化索引或查询结构。

EXPLAIN PLAN
要分析SQL查询性能,
EXPLAIN PLAN
具体来说,当你对一个SQL语句执行
EXPLAIN PLAN
EXPLAIN SELECT ...
EXPLAIN (ANALYZE, BUFFERS) SELECT ...
EXPLAIN PLAN FOR SELECT ...
TABLE ACCESS FULL
INDEX SCAN
HASH JOIN
NESTED LOOPS
SORT
Using temporary
Using filesort
解读时,我们通常会从顶层操作开始,层层深入,找出那些
Rows
Cost
Using filesort
Using temporary
WHERE
ORDER BY
Using filesort
-- MySQL示例 EXPLAIN SELECT * FROM orders WHERE customer_id = 100 AND order_date > '2023-01-01' ORDER BY order_total DESC; -- PostgreSQL示例 EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE customer_id = 100 AND order_date > '2023-01-01' ORDER BY order_total DESC;
通过反复试验和观察
EXPLAIN PLAN
当我们拿到
EXPLAIN PLAN
首先是type
Node Type
ALL
Seq Scan
TABLE ACCESS FULL
WHERE
index_scan
INDEX SCAN
INDEX RANGE SCAN
ref
Index Only Scan
INDEX UNIQUE SCAN
JOIN
Nested Loop Join
HASH JOIN
Merge Join
其次是Rows
Rows Removed by Filter
Rows
Rows
type
Rows
然后是Cost
Cost
Cost
Cost
Cost
Cost
再来是Extra
Actual Loops
Actual Time
ANALYZE
Predicate Information
Using filesort
Using temporary
GROUP BY
DISTINCT
Actual Time
ANALYZE
EXPLAIN ANALYZE
Cost
Filtered
WHERE
Filtered
理解这些核心指标,就像掌握了数据库的“诊断语言”,能帮助我们快速定位到查询的症结所在。
复杂的查询计划,往往像一张错综复杂的地图,让人无从下手。但别急,我们可以遵循一些经验法则,逐步剥茧抽丝,找出优化的突破口。
我的习惯是,首先寻找最“重”的操作。这个“重”体现在几个方面:
Cost
EXPLAIN PLAN
TABLE ACCESS FULL
Seq Scan
WHERE
Rows
NESTED LOOPS
其次,警惕“额外信息”中的红旗。
Extra
Using filesort
ORDER BY
GROUP BY
Using temporary
GROUP BY
DISTINCT
Using where
Using index
Using index condition
WHERE
再次,关注连接(JOIN)操作。连接的顺序和类型对性能影响巨大。
WHERE
NESTED LOOPS
HASH JOIN
Merge Join
最后,考虑索引的优化。这通常是最直接且有效的优化手段。
EXPLAIN PLAN
Using filesort
WHERE
WHERE
ORDER BY
GROUP BY
SELECT
WHERE
优化是一个迭代的过程,每次修改后都要重新运行
EXPLAIN PLAN
尽管
EXPLAIN PLAN
MySQL的EXPLAIN
MySQL的
EXPLAIN
EXPLAIN SELECT ...
id
select_type
SIMPLE
PRIMARY
SUBQUERY
DERIVED
table
type
ALL
index
range
ref
eq_ref
const
ALL
const
possible_keys
key
key_len
ref
Rows
Filtered
Extra
Using filesort
Using temporary
Using where
Using index
Extra
Rows
Filtered
PostgreSQL的EXPLAIN
PostgreSQL的
EXPLAIN
EXPLAIN SELECT ...
EXPLAIN (ANALYZE) SELECT ...
EXPLAIN (ANALYZE, BUFFERS) SELECT ...
ANALYZE
EXPLAIN (FORMAT JSON) SELECT ...
ANALYZE
Node Type
Seq Scan
INDEX SCAN
HASH JOIN
Nested Loop
Plan Rows
Actual Rows
Actual Time
Loops
Buffers
Filter
Join Filter
ANALYZE
Buffers
Oracle的EXPLAIN PLAN
Oracle的
EXPLAIN PLAN
EXPLAIN PLAN FOR SELECT ...;
PLAN_TABLE
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', NULL, 'ALLSTATS LAST'));id
Operation
TABLE ACCESS FULL
INDEX RANGE SCAN
NESTED LOOPS
HASH JOIN
Name
Rows
Bytes
Cost
Time
Predicate Information
EXPLAIN PLAN
DBMS_XPLAN
ALLSTATS LAST
ANALYZE
总的来说,虽然语法和输出细节各异,但核心逻辑是相通的:它们都试图通过操作类型、估算行数、成本和附加信息来揭示查询的执行路径。掌握一种数据库的
EXPLAIN PLAN
以上就是如何在SQL中分析查询性能?EXPLAIN PLAN的解读方法的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号