如何通过 PROFILE 结果优化密码查询?

How to optimize cypher query by PROFILE result?

我有一个大约有 10,000 个节点的数据库。我 运行 通过探查器进行以下查询并收到意外数量的数据库命中。该查询应该从给定用户 uid 中找到所有员工。在真实数据集上,我得到 9 行。

PROFILE MATCH (:User {uid:{0}})<-[:manages]-(employee)
RETURN employee

我从探查器收到以下输出。为什么我在这里得到如此多的数据库点击?能改变什么?

Projection
  |
  +Expand(All)
    |
    +Filter
      |
      +NodeByLabelScan

+-----------------+---------------+------+--------+--------------------------------+---------------------------------+
|        Operator | EstimatedRows | Rows | DbHits |                    Identifiers |                           Other |
+-----------------+---------------+------+--------+--------------------------------+---------------------------------+
|      Projection |            38 |    9 |      0 | anon[64], anon[7], employee    |                     employee    |
|     Expand(All) |            38 |    9 |     10 | anon[64], anon[7], employee    | ()<-[:manages]-(employee)       |
|          Filter |            34 |    1 |    342 |                        anon[7] |  anon[7].uid == {  AUTOSTRING0} |
| NodeByLabelScan |           342 |  342 |    343 |                        anon[7] |                      :User      |
+-----------------+---------------+------+--------+--------------------------------+---------------------------------+

Total database accesses: 695
neo4j-sh (?)$

您应该在 User(uid) 上创建索引:

CREATE INDEX ON :User(uid)

或者创建一个唯一性约束(这也会创建一个索引):

CREATE CONSTRAINT ON (u:User) ASSERT u.uid IS UNIQUE

创建索引将启用索引操作查找,而不是 NodeByLabelScan,这样效率会更高。