在 NebulaGraph 中,
EXPLAIN
和PROFILE
是用于分析查询执行计划的核心工具,主要用于优化查询性能。它们的核心功能都是展示查询的执行计划,但在是否实际执行查询和输出信息的详细程度上有本质区别。一、核心区别
特性 | EXPLAIN | PROFILE |
---|---|---|
是否执行查询 | 不执行查询,仅生成预估的执行计划 | 实际执行查询,生成带有真实统计数据的执行计划 |
输出信息 | 包含执行步骤、算子类型、预估基数等 | 包含EXPLAIN 的所有信息,额外增加实际执行时间、处理行数、IO 等统计数据 |
资源消耗 | 几乎无消耗(仅解析查询,不处理数据) | 有消耗(需实际读写数据,执行完整查询流程) |
适用场景 | 预检查查询计划是否合理(如是否走索引) | 定位查询性能瓶颈(如哪个步骤耗时最长) |
二、使用方法及输出解读
1. EXPLAIN
:预估执行计划
EXPLAIN
用于在不执行查询的情况下,生成查询的预估执行计划,帮助开发者提前判断查询是否存在明显的优化空间(如是否全图扫描、是否正确使用索引等)。语法:
在查询语句前直接加
在查询语句前直接加
EXPLAIN
关键字。EXPLAIN <your_query>;
示例:
查看从顶点 1 出发,遍历
查看从顶点 1 出发,遍历
follow
边的执行计划:EXPLAIN GO FROM 1 OVER follow;
输出解读:
输出结果是一个执行计划树,主要包含以下关键信息:
输出结果是一个执行计划树,主要包含以下关键信息:
operator
:执行算子(如GetNeighbors
、Filter
、Project
等,代表具体的执行步骤)。estCardinality
:预估处理的记录数(基数),反映 NebulaGraph 对该步骤数据量的预估。dependencies
:算子的依赖关系(执行顺序)。
例如,上述查询的
EXPLAIN
输出可能包含GetNeighbors
算子(用于获取邻居顶点),并显示预估的邻居数量,帮助判断是否存在全图扫描风险。2. PROFILE
:实际执行计划
PROFILE
会实际执行查询,并在执行完成后生成包含真实运行时统计数据的执行计划,是定位性能瓶颈的核心工具。语法:
在查询语句前直接加
在查询语句前直接加
PROFILE
关键字。PROFILE <your_query>;
示例:
实际执行从顶点 1 出发遍历
实际执行从顶点 1 出发遍历
follow
边的查询,并获取执行统计:PROFILE GO FROM 1 OVER follow;
输出解读:
输出结果包含
输出结果包含
EXPLAIN
的所有信息,额外增加了实际执行的统计数据:durationInUs
:该算子的执行耗时(微秒),用于定位耗时步骤。rows
:该算子实际处理的记录数(与estCardinality
对比,可判断预估是否准确)。counters
:更详细的统计(如磁盘 IO 次数、网络传输量等,视算子类型而定)。
例如,若
GetNeighbors
算子的durationInUs
特别大,可能说明该步骤存在性能问题(如未走索引导致全图扫描)。三、使用场景建议
-
编写查询时,先用
EXPLAIN
预检查:
例如,在执行复杂查询前,用EXPLAIN
确认是否正确使用了索引(如IndexScan
算子是否出现),避免写出全图扫描的低效查询。 -
查询运行慢时,用
PROFILE
定位瓶颈:
对比各算子的durationInUs
,找到耗时最长的步骤。例如:- 若
Filter
算子耗时高,可能是过滤条件太复杂,需优化表达式; - 若
GetNeighbors
耗时高且rows
远大于estCardinality
,可能是预估不准,需更新统计信息(ANALYZE
)。
- 若
-
注意
PROFILE
的副作用:PROFILE
会实际执行查询,若查询是写入操作(如INSERT
、UPDATE
),会真实修改数据,因此建议仅在测试环境使用,或对只读查询使用。
总结
EXPLAIN
是 “预览工具”:不执行查询,提供预估计划,用于提前优化。PROFILE
是 “诊断工具”:执行查询,提供真实统计,用于定位性能瓶颈。- 两者结合使用,可高效优化 NebulaGraph 的查询性能。