查询优化

Neo4j 旨在尽可能快地执行查询。但是,在优化查询执行性能时,使用有关领域和应用程序的知识重新表达查询可能会有所帮助。

此页面包含有关如何使用不同策略优化查询的信息。

有关更改查询运行时,请参阅有关Cypher® 运行时概念的页面。

一般建议

手动查询性能优化的总体目标是确保仅从图中检索必要的数据。

查询应尽早过滤数据以减少查询执行后期阶段需要执行的工作量。这也适用于返回的内容:应避免返回整个节点和关系,而应改为选择和仅返回需要的数据。您还应该确保为可变长度模式设置上限,因此它们不会覆盖比需要更大的数据集部分。

每个 Cypher 查询都会被 Cypher 查询规划器优化并转换为执行计划。为了最大程度地减少为此使用的资源,请尽可能使用参数代替字面量。这允许 Cypher 重新使用查询,而不必解析和构建新的执行计划。

要详细了解本节中提到的执行计划运算符,请参阅运算符

查询选项

可以使用查询选项微调查询执行。

为了使用一个或多个这些选项,查询必须以 CYPHER 开头,后跟查询选项,如下例所示

CYPHER query-option [further-query-options] query

有关 Cypher 中可用的各种运行时,请参阅Cypher 运行时

Cypher 计划器

Cypher 计划器获取 Cypher 查询并计算一个解决该查询的执行计划。对于任何给定的查询,可能存在许多执行计划候选,它们都以不同的方式解决查询。计划器使用搜索算法来查找估计执行成本最低的执行计划。

此表描述了可用的计划器选项

查询选项 描述 默认

planner=cost

使用基于成本的规划,并对计划搜索空间和时间设置默认限制。

planner=idp

planner=cost 的同义词。

planner=dp

使用基于成本的规划,不对计划搜索空间和时间设置限制,以对最佳执行计划执行穷举搜索。

使用此选项可能会显著增加查询的规划时间。

Cypher 连接组件计划器

Cypher 计划器的一部分负责将单独模式的子计划组合成更大的计划 - 这项任务被称为连接组件

此表描述了连接组件计划器的可用查询选项

查询选项 描述 默认

connectComponentsPlanner=greedy

在组合子计划时使用贪婪方法。

使用此选项可能会显著减少查询的规划时间。

connectComponentsPlanner=idp

在组合子计划时使用基于成本的 IDP 搜索算法。

使用此选项可能会显著增加查询的规划时间,但通常会找到更好的计划。

Cypher 查询选项 connectComponentsPlanner 已弃用,将被删除,不会有替换。产品默认行为是在组合子计划时使用基于成本的 IDP 搜索算法,并将保持该行为。

Cypher 更新策略

此选项影响更新查询的急切程度。

可能的值是

查询选项 描述 默认

updateStrategy=default

更新查询在需要时会急切执行。

updateStrategy=eager

更新查询始终会急切执行。

Cypher 表达式引擎

此选项影响运行时评估表达式的方式。

可能的值是

查询选项 描述 默认

expressionEngine=default

编译表达式,并在需要时使用编译的表达式引擎。

expressionEngine=interpreted

始终使用解释表达式引擎。

expressionEngine=compiled

始终编译表达式,并使用编译表达式引擎。

Cypher 运算符引擎

此查询选项影响管道运行时是否尝试为运算符组生成编译代码。

可能的值是

查询选项 描述 默认

operatorEngine=default

在适用时尝试生成编译的运算符。

operatorEngine=解释

切勿尝试生成编译后的运算符。

operatorEngine=编译

始终尝试生成编译的运算符。

不能与runtime=slotted一起使用。

Cypher 解释管道回退

此查询选项影响流水线运行时对它不支持的运算符的行为方式。

可用选项为

查询选项 描述 默认

interpretedPipesFallback=默认

等同于interpretedPipesFallback=whitelisted_plans_only

interpretedPipesFallback=禁用

如果计划包含流水线运行时不支持的任何运算符,则会选择另一个运行时来执行整个计划。

不能与runtime=slotted一起使用。

interpretedPipesFallback=whitelisted_plans_only

执行计划的一部分可以在另一个运行时执行。只有某些运算符允许在另一个运行时执行。

不能与runtime=slotted一起使用。

interpretedPipesFallback=全部

执行计划的一部分可以在另一个运行时执行。任何运算符都允许在另一个运行时执行。使用此选项设置的查询可能会产生不正确的结果或失败。

不能与runtime=slotted一起使用。

此设置处于实验阶段,不建议在生产环境中使用。

Cypher 重新计划

Cypher 重新计划在以下情况下发生

可能存在Cypher 查询计划在非理想时间发生的情况。例如,当查询必须尽快完成并且已经存在有效计划时。

并非所有查询都同时进行重新计划;它在与运行查询相同的线程中执行,并且会阻塞查询。但是,重新计划一个查询不会重新计划任何其他查询。

有三个不同的重新计划选项可用

选项 描述 默认

replan=默认

这是上面描述的计划和重新计划选项。

replan=强制

即使计划根据计划规则有效,这也会强制重新计划。新计划完成后,它将替换查询缓存中的现有计划。

replan=跳过

如果已存在有效计划,即使计划规则通常会指示应重新计划,它也将被使用。

重新计划选项将附加到查询之前。

例如

CYPHER replan=force MATCH ...

在混合工作负载中,您可以使用 Cypher EXPLAIN 命令强制重新计划。这对于在已知的低负载时间安排计划成本高的查询的重新计划很有用。使用EXPLAIN 将确保仅计划查询,但不会执行。

例如

CYPHER replan=force EXPLAIN MATCH ...

在已知的高负载期间,replan=skip 可以用来避免引入不需要的延迟峰值。

Cypher 推断模式部分

对于某些查询,规划器可以从图结构中推断谓词,例如标签或类型,从而增强其估计每个运算符将产生的行数的能力。(有关运算符和估计行数在查询执行计划中的作用的更多信息,请参阅了解执行计划 - 阅读执行计划。)选项inferSchemaParts控制规划器推断谓词的程度。

选项 描述

inferSchemaParts=关闭

没有推断出任何谓词。

inferSchemaParts=most_selective_label

关系类型用于推断连接节点上的标签。使用对应于最少节点数的标签来估计行数。避免推断多个标签可以提高对具有多个相关标签的节点的准确性,例如每个:Actor都是一个:Person

如果没有提供此查询选项,则将使用操作手册 → 配置设置 → dbms.cypher.infer_schema_parts中设置的值。