【问题标题】:Neo4j - How can I improve query execution time (server consumption)?Neo4j - 如何提高查询执行时间(服务器消耗)?
【发布时间】:2017-08-23 14:06:24
【问题描述】:

我使用具有 177,000,000 个节点和 352,000,000 个关系的 Neo4j 数据库(通过 docker 访问)。这是我要改进的示例查询:

MATCH (a:NodeA {prop1: $prop1})<-[:BA]-(b:NodeB)-[:BC]->(c:NodeC)-[:CD]->(d:NodeD)-[:DE]->(e:NodeE)
RETURN e.prop2, a.prop1, a.prop3, c.prop4, c.prop5, b.prop6;

prop1 上有一个索引。

我使用 python v1 驱动程序来测量查询执行时间。 ResultSummary 中有两个不同的时间:

  • 服务器使结果可供消费所用的时间(我称之为“可用”时间)
  • 服务器消费结果所用的时间(我称之为“消费”时间)

我的查询的“可用”时间很短(1 到 80 毫秒),但“消耗”时间很长(最多 350000 毫秒)。

我尝试使用参数优化查询,并更改了一些内存配置(增加页面缓存大小和减少堆大小),这导致更短的“可用”时间(1 到 15 毫秒)和更短的“消耗”时间(20000 到 250000 毫秒)。 可惜消耗时间还是很高的!

我的问题:

  • 我不太了解这两个时间度量之间的区别。他们测量什么?
  • 如何改进我的查询? (除了索引)

谢谢你, 雷马

【问题讨论】:

  • 你有多少结果? (= MATCH (.. your match clause.) RETURN COUNT(*) 返回什么?)
  • 大约有 9000 个结果。

标签: neo4j cypher


【解决方案1】:

为了回答您的第一个问题,我猜响应是流式传输的,因此可用时间是第一条记录到达的时间,而消耗时间是接收和处理完整结果集的时间,收到的最后一条记录和收到的第一条记录之间存在一定的时间差。如果我的假设被证明是错误的,我深表歉意。 要回答您的第二个问题,请在内存缓存中保留尽可能多的数据,或者如果不能选择高 RAM,请使用 SSD。以下链接可能会有所帮助。

1)Linux file system tuning

2) Memory tuning

3)Disk and ram considerations

【讨论】:

  • 感谢您的解释。现在,我更好地理解了这些术语。我已经更改了内存配置并改进了查询执行时间,但仍然很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2022-11-04
  • 2015-07-11
相关资源
最近更新 更多