在 NebulaGraph 中,EXPLAIN和PROFILE是用于分析查询执行计划的核心工具,主要用于优化查询性能。它们的核心功能都是展示查询的执行计划,但在是否实际执行查询和输出信息的详细程度上有本质区别。
EXPLAIN用于在不执行查询的情况下,生成查询的预估执行计划,帮助开发者提前判断查询是否存在明显的优化空间(如是否全图扫描、是否正确使用索引等)。
语法:
在查询语句前直接加EXPLAIN关键字。
示例:
查看从顶点 1 出发,遍历follow边的执行计划:
EXPLAIN GO FROM 1 OVER follow;
输出解读:
输出结果是一个执行计划树,主要包含以下关键信息:
operator:执行算子(如GetNeighbors、Filter、Project等,代表具体的执行步骤)。
estCardinality:预估处理的记录数(基数),反映 NebulaGraph 对该步骤数据量的预估。
dependencies:算子的依赖关系(执行顺序)。
例如,上述查询的EXPLAIN输出可能包含GetNeighbors算子(用于获取邻居顶点),并显示预估的邻居数量,帮助判断是否存在全图扫描风险。
PROFILE会实际执行查询,并在执行完成后生成包含真实运行时统计数据的执行计划,是定位性能瓶颈的核心工具。
语法:
在查询语句前直接加PROFILE关键字。
示例:
实际执行从顶点 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 的查询性能。