第 5 章 查询分析和调整 查询分析和调整
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
任何生产中的图形应用程序都依赖于高效的查询和对资源的有效利用。这一点在关键任务应用程序中更为重要,因为高效查询和缓慢查询之间的差异有时会带来严重后果,如经济损失、安全威胁甚至生命损失。本章不只提供现成的解决方案,而是重点讨论为什么查询能高效执行(或不能)。其目的是让你有足够的深度理解,以便在需要调整查询时能够对自己的查询进行推理。
作为Neo4j的顾问,我们在各种领域都遇到过无数的Cypher查询,好消息是,如果你对基本原理掌握得很好,大多数查询都可以调整得更好。在本章中,你将学习查询规划器如何运行,以及如何阅读和理解它生成的执行计划。我们还将探讨锚选择性和行万有引力等概念,这些概念是编写优秀查询的核心,以及如何使用索引提高性能。
查询执行
Cypher查询一开始是一个字符串,描述了要在图中匹配的模式、应用的条件以及要对结果进行的转换。图 5-1显示了 Cypher 查询字符串在执行过程中产生结果所涉及的高级步骤。
图 5-1. Cypher 的查询处理流水线
查询首先被解析为抽象语法树(AST)。然后经过一系列规范化步骤,包括语义分析。查询优化器或查询规划器使用数据库统计数据以及索引和约束的当前状态来生成一个命令式逻辑计划。该计划通常代表了针对当前数据库状态执行查询的最有效方式。它包含执行查询的步骤,由二进制操作符树组成。
接下来,Cypher 运行时会将该计划转化为物理计划,并在数据库中执行。Cypher 计划器和运行时在不断改进,新版本的 Neo4j 带来了更多更高效的查询执行。在编写本书时,Cypher 有三种可用的运行时:槽式、流水线式和并行。默认运行时(目前在Neo4j Enterprise中为流水线运行时)通常是整体性能最好的运行时,特别是对于并行运行大量查询的事务性工作负载。每个运行时都有自己的特点。在了解了运行时的优缺点后,你可能会决定覆盖特定查询的运行时。本章稍后我们将再次讨论运行时。现在让我们看看查询规划器是如何工作的。
模式锚点
要掌握的下一个概念是查询规划器用于匹配图中模式的步骤序列。简而言之,规划器必须
-
在模式中找出合适的锚点(作为查询在图中进行匹配的入口点的节点或关系)。
-
找到这些锚点,如果页面缓存中还没有,就将它们加载到内存中。
-
从锚点展开,根据指针遍历图,找到 Cypher 查询中指定模式的出现点。
在此过程中,规划器会评估谓词、聚合以及其他转换和操作。
了解锚点为何是查询规划和执行的关键非常重要。下面我们将通过一组查询来探讨。
全局图查询
第一个查询非常广泛:它匹配图中的所有节点:
MATCH (n) RETURN n
在没有任何锚点的情况下,图中没有明确的起始位置。规划器必须从节点存储中加载所有节点。这种类型的查询被称为全局图查询,因为它利用了整个图,并将消耗这些结果的负担放在了客户端应用程序上--这在非三角图上会很昂贵。
基于标签的查询
下一个查询更加具体--它匹配所有艺术家及其曲目:
MATCH (a:Artist)<-[:ARTIST]-(t:Track) RETURN a,t
查询规划器现在掌握了更多信息。它不需要扫描包含其他节点(如播放列表)的整个图。它可以使用三个锚点中的任意一个:标签为 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access