如何通过 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
,这样效率会更高。
我有一个大约有 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
,这样效率会更高。