Neo4j.rb查询速度慢

时间:2015-02-02 17:34:24

标签: ruby-on-rails-4 neo4j neo4j.rb

我有Neo4j v2.1.6(默认配置)和Neo4j.rb v4.1.0。所有查询都在50ms左右。我在db中只有5个节点。

例如:

User.find_by(person_id: 826268332)

CYPHER 47ms MATCH (n:`User`) WHERE (n.person_id = {n_person_id})  RETURN n LIMIT {limit_1} | {:n_person_id=>826268332, "limit_1"=>1}

哪里可能有问题?

2 个答案:

答案 0 :(得分:2)

这很奇怪。在neo4j gem中,我经常会看到简单的查询在大约1-5毫秒内运行。

对于调试,如果你这样做会怎么样?

User.where(yeti_person_id: 826268332).first

另外,这会给你带来什么?

puts User.where(yeti_person_id: 826268332).to_cypher

答案 1 :(得分:2)

我是Neo4j.rb的核心维护者之一,以及上面回复的Brian Underwood。这不完全是一个完整的答案,因为我们需要了解更多关于你的系统的答案,但我在这里发布这个,因为它对于一个评论来说太过分了。

我的钱是您的数据库或系统出错了。对于运行Windows的用户,我们报告了类似的问题 - 本地工作时查询速度慢,无法确定。见Neo4j.rb version 3.0 slow performance RoR, over 1024ms for all queries。我们无法将其固定下来。在本地,运行完全相同的查询,我第一次运行时看到13ms,之后每次运行约3ms。索引在一个小的数据库中不会产生影响。

如何限制问题的可能性并通常提高绩效:

  • 使用Ruby MRI 2.2.0
  • 使用Neo4j 2.1.6或2.2.0
  • 使用Mac或Linux,而不是Windows
  • 需要您应用中的ojoj_mimic_json宝石

如果您的数据库和应用服务器位于两个不同的网络中,您将看到更长的响应。

关于在MongoDB和PostgreSQL中这个简单查询要快得多的评论:是的,它会成为。这两个返回简单查询的速度比Neo4j.rb快,原因不少于两个:

  • 用于连接这些数据库的Ruby gems不使用REST接口,它们使用自定义二进制协议。
  • 两者都针对快速返回单个记录进行了优化,Neo针对快速返回大量记录进行了优化。

在发布Neo4j.rb 4.0之前,我对Postgres和MongoDB做了大量的基准测试,并发现了相同的结果:他们在返回单个对象时粉碎了我们。 (PostgreSQL是一项了不起的技术。)一旦你开始寻找相关的对象,事情就会平衡,当你增加复杂性时,差异变得更加显着。不幸的是,我没有任何数字可以分享,但如果我有时间的话,我会很快发表一篇博文。