Neo4J 数据库性能
Neo4J Database Performance
我们有一个 Neo4J 数据库(运行 企业版 4.3.2)包含:
6,800,000 个节点,标签为 itemA
。
带有标签 itemB
的 25,000 个节点。
带有标签 itemC
.
的 18 个节点
带有标签 itemA
的每个节点都通过称为 a_b
.
的关系与至少一个带有标签 itemB
的节点相关
带有标签 itemA
的每个节点都通过称为 a_c
.
的关系与至少一个带有标签 itemC
的节点相关
有 7,000,000 a_b
个关系。
有 7,000,000 a_c
个关系。
带有标签 itemA
的节点有一个 属性 prop1
,其中包含 3 个字符串值之一 - 每个字符串的长度大约为 20 个字符。 prop1
已编入索引。
以下查询及其结果:
Query
Duration(ms)
match (a:itemA) return count(a)
1
match (b:itemB) return count(b)
1
match (a:itemA)-[r:a_b]->(b:itemB) count(a)
1,800-2,200
match (a:itemA)-[r:a_b]->(b:itemB) return a.prop1, count(a)
10,500-14,000
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return count(a)
14,500
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return a.prop1, count(a)
> 20,000
我们咨询了 Neo4J 的支持团队。我们很高兴我们的服务器有足够的资源并且 Neo4J 数据库服务器配置正确。
我的问题:
这种规模的查询真的应该这么慢吗?如果不是,我们做错了什么?
第三个和第四个查询可以优化,因为你只计算节点度:
第三个查询:
match (a:itemA)
WITH a,size((a)-[:a_b]->()) as degree
RETURN sum(degree) as result
第四个查询:
match (a:itemA) return a.prop1, size((a)-[:a_b]->())
第五和第六个查询无论如何都会爆炸式增长,因为您正在计算同时出现的次数,结果可能会得到很大的数字。您可以使用 PROFILE
子句来检查幕后发生的事情。
我们有一个 Neo4J 数据库(运行 企业版 4.3.2)包含:
6,800,000 个节点,标签为 itemA
。
带有标签 itemB
的 25,000 个节点。
带有标签 itemC
.
带有标签 itemA
的每个节点都通过称为 a_b
.
itemB
的节点相关
带有标签 itemA
的每个节点都通过称为 a_c
.
itemC
的节点相关
有 7,000,000 a_b
个关系。
有 7,000,000 a_c
个关系。
带有标签 itemA
的节点有一个 属性 prop1
,其中包含 3 个字符串值之一 - 每个字符串的长度大约为 20 个字符。 prop1
已编入索引。
以下查询及其结果:
Query | Duration(ms) |
---|---|
match (a:itemA) return count(a) |
1 |
match (b:itemB) return count(b) |
1 |
match (a:itemA)-[r:a_b]->(b:itemB) count(a) |
1,800-2,200 |
match (a:itemA)-[r:a_b]->(b:itemB) return a.prop1, count(a) |
10,500-14,000 |
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return count(a) |
14,500 |
match (a:itemA)-[r:a_b]->(b:itemB), (a)-[r2:a_c]->(c:itemC) return a.prop1, count(a) |
> 20,000 |
我们咨询了 Neo4J 的支持团队。我们很高兴我们的服务器有足够的资源并且 Neo4J 数据库服务器配置正确。
我的问题:
这种规模的查询真的应该这么慢吗?如果不是,我们做错了什么?
第三个和第四个查询可以优化,因为你只计算节点度:
第三个查询:
match (a:itemA)
WITH a,size((a)-[:a_b]->()) as degree
RETURN sum(degree) as result
第四个查询:
match (a:itemA) return a.prop1, size((a)-[:a_b]->())
第五和第六个查询无论如何都会爆炸式增长,因为您正在计算同时出现的次数,结果可能会得到很大的数字。您可以使用 PROFILE
子句来检查幕后发生的事情。