Indexing neo4j查询响应时间

Indexing neo4j查询响应时间,indexing,time,neo4j,response,Indexing,Time,Neo4j,Response,测试查询响应时间会返回有趣的结果: 当在一行中多次执行同一查询时,首先响应时间会变得更好,直到某一点,然后在每次执行时都会变慢或不一致地跳转 在使用using索引时运行相同的查询,在其他时间不使用using索引时,返回几乎相同的响应时间范围(如第1条所述),尽管配置文件正在变得更好(使用索引时db命中次数更少) 删除索引并重新运行查询将返回与在索引存在但查询已在未使用索引的情况下执行时执行查询相同的配置文件 对上述结果有何解释 如果数据库命中率有所提高,但响应时间却没有提高,那么知道查询是否得到

测试查询响应时间会返回有趣的结果:

  • 当在一行中多次执行同一查询时,首先响应时间会变得更好,直到某一点,然后在每次执行时都会变慢或不一致地跳转
  • 在使用using索引时运行相同的查询,在其他时间不使用using索引时,返回几乎相同的响应时间范围(如第1条所述),尽管配置文件正在变得更好(使用索引时db命中次数更少)
  • 删除索引并重新运行查询将返回与在索引存在但查询已在未使用索引的情况下执行时执行查询相同的配置文件
  • 对上述结果有何解释


    如果数据库命中率有所提高,但响应时间却没有提高,那么知道查询是否得到了改进的最佳方法是什么?

    了解查询如何执行的最佳方法可能是使用命令,该命令将实际解释数据库如何执行查询。这将为您提供有关cypher如何使用索引
    提示的反馈。您还可以比较同一查询的不同公式,以查看哪些公式会导致更少的
    dbHits

    对于为什么查询在各种情况下需要可变的时间,可能没有全面的答案。您尚未提供您的模型、数据或查询。它取决于查询之外的一系列因素,例如数据模型、堆是否满、堆有多满、索引类型(是否使用
    usingindex
    hints)——这些只是neo4j/java级别的因素。在操作系统级别,还有许多其他的可能性/偶然性使得精确的性能度量变得困难


    一般来说,当我关心这些事情时,我发现收集一个大数据样本(运行查询100000次)然后取一个平均值是很好的。在这样的样本中,所有超出您控制范围的因素都趋于平均,但如果您希望具体预测下一次查询将需要多长时间(以毫秒为单位),这在现实中可能是不可能的。

    感谢FrobberOfBits!正如您所建议的,我正在使用PROFILE命令。问题是,我真的不知道数据库命中率越低(执行计划越好)是否等于查询速度越快。根据您的经验,虽然响应时间不一致,但我能指望它吗?还使用了neo4j.properties文件中的缓存,在soft和none之间切换,但只有在重新启动neo4j服务器后第一次运行查询时才看到差异。稍后我将检查JVM。平均值是个好主意,响应时间是否显示在日志中?这取决于您所说的一致性。假设一个查询通常需要500毫秒。我认为你永远不会得到一致的500毫秒。也许在300-600范围内看到任何东西都是典型的,偶尔会出现更大或更小的异常值。所以在这个意义上,我认为你不应该期望一致性。但是,如果查询需要500毫秒,并且您得到的结果与执行时间范围非常大的结果大不相同,那就很奇怪了。但同样,这取决于您的数据、查询计划以及您的机器正在执行的其他操作。AFAIK日志中没有显示执行时间。这是你需要构建一个简单脚本来衡量的东西。再次感谢FrobberOfBits!目前,大多数查询的两个版本的响应时间(运行几次后)为:~20~150ms,这符合您的描述。使用本地数据库而不是真正的数据库,数据的大小和没有网络延迟可能有助于提高速度。奇怪的是,数据库命中率较低的查询速度并不快,但根据您的说法,这是有道理的。我猜,正如你所说,我将不得不在真实的数据库上运行它很多次,并测量平均值。我想知道这样做是否会为更好的执行计划带来更好的时间。我开始在这里写一篇博客文章,以防你想尝试一下:也许你可以共享你的数据模型、查询和配置文件。然后我们可以帮你解释结果。有许多因素会影响运行时。