0

我有 Neo4j v2.1.6(默认配置)和 Neo4j.rb v4.1.0。所有查询都在 50 毫秒左右缓慢。我在 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}

哪里可能有问题?

4

2 回答 2

2

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

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

User.where(yeti_person_id: 826268332).first

另外,这给了你什么?

puts User.where(yeti_person_id: 826268332).to_cypher
于 2015-02-02T19:32:53.720 回答
2

我是 Neo4j.rb 的核心维护者之一,还有上面回答的 Brian Underwood。这不是一个完整的答案,因为我们需要更多地了解您的系统来回答这个问题,但我在这里发布这个是因为它对于一个评论来说太多了。

我的钱花在了您的数据库或系统出现问题上。对于运行 Windows 的用户,我们报告了一个类似的问题——在本地工作时查询缓慢,无法确定原因。请参阅Neo4j.rb 版本 3.0 低性能 RoR,所有查询超过 1024 毫秒。我们无法确定它。在本地,运行完全相同的查询,我第一次运行它时看到 13 毫秒,之后每次运行大约 3 毫秒。索引不会对那么小的数据库产生影响。

限制出现问题的机会并普遍提高性能的方法:

  • 使用 Ruby MRI 2.2.0
  • 使用 Neo4j 2.1.6 或 2.2.0
  • 使用 Mac 或 Linux,而不是 Windows
  • 在您的应用中需要oj和gemoj_mimic_json

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

关于这个简单查询在 MongoDB 和 PostgreSQL 中要快得多的评论:是的,它将是。两者都比 Neo4j.rb 更快地返回简单查询,原因不少于两个:

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

在发布 Neo4j.rb 4.0 之前,我对 Postgres 和 MongoDB 进行了大量基准测试,并发现了相同的结果:它们在返回单个对象时压垮了我们。(PostgreSQL 是一个了不起的技术通用。)不过,一旦您开始寻找相关对象,事情就会平衡,并且随着您增加复杂性,差异变得更加显着。不幸的是,我没有任何数字要分享,但如果我有时间的话,我很快就会写一篇关于它的博客文章。

于 2015-02-02T22:47:55.633 回答