Neo4j.rb 慢查询
Neo4j.rb slow queries
我有 Neo4j v2.1.6(默认配置)和 Neo4j.rb v4.1.0。所有查询都慢 50 毫秒左右。我在数据库中只有 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}
哪里会出问题?
这很奇怪。在 neo4j gem 中,我经常看到简单的查询 运行 大约需要 1-5 毫秒。
为了调试,如果你这样做了会怎样?
User.where(yeti_person_id: 826268332).first
还有,这给你带来了什么?
puts User.where(yeti_person_id: 826268332).to_cypher
我是 Neo4j.rb 的核心维护者之一,还有上面回答的 Brian Underwood。这不是一个完整的答案,因为我们需要更多地了解您的系统才能回答这个问题,但我 post 在这里是因为它太多了,无法发表评论。
我的钱花在了你的数据库或系统的问题上。我们报告了一个类似的问题——在本地工作时查询缓慢,无法确定原因——针对用户 运行ning Windows。参见 Neo4j.rb version 3.0 slow performance RoR, over 1024ms for all queries。我们无法确定它。在本地,运行使用完全相同的查询,我第一次 运行 时看到 13 毫秒,此后每次看到 ~3 毫秒。索引不会对那么小的数据库产生影响。
限制出现问题的可能性并普遍提高性能的方法:
- 使用Ruby MRI 2.2.0
- 使用 Neo4j 2.1.6 或 2.2.0
- 使用Mac或Linux,而不是Windows
- 在您的应用中需要
oj
和 oj_mimic_json
gem
如果您的数据库和应用程序服务器位于两个不同的网络中,您将看到类似查询的更长响应。
关于这个简单查询在 MongoDB 和 PostgreSQL 中要快得多的评论:是的,它将会如此。这两个 return 简单查询都比 Neo4j.rb 快,原因不少于两个:
- 用于连接到这些数据库的 Ruby gem 不使用 REST 接口,它们使用自定义二进制协议。
- 两者都针对 return 快速处理单个记录进行了优化,Neo 针对 return 快速处理大量记录进行了优化。
在发布 Neo4j.rb 4.0 之前,我针对 Postgres 和 MongoDB 进行了大量基准测试,发现了相同的结果:当 returning 单个对象时,它们会压垮我们。 (PostgreSQL 是一项了不起的通用技术。)但是,一旦您开始寻找相关对象,事情就会平衡,并且随着您增加复杂性,差异变得更加显着。不幸的是,我没有任何数字可以分享,但如果我有时间的话,我很快就会写一篇关于它的博客 post。
我有 Neo4j v2.1.6(默认配置)和 Neo4j.rb v4.1.0。所有查询都慢 50 毫秒左右。我在数据库中只有 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}
哪里会出问题?
这很奇怪。在 neo4j gem 中,我经常看到简单的查询 运行 大约需要 1-5 毫秒。
为了调试,如果你这样做了会怎样?
User.where(yeti_person_id: 826268332).first
还有,这给你带来了什么?
puts User.where(yeti_person_id: 826268332).to_cypher
我是 Neo4j.rb 的核心维护者之一,还有上面回答的 Brian Underwood。这不是一个完整的答案,因为我们需要更多地了解您的系统才能回答这个问题,但我 post 在这里是因为它太多了,无法发表评论。
我的钱花在了你的数据库或系统的问题上。我们报告了一个类似的问题——在本地工作时查询缓慢,无法确定原因——针对用户 运行ning Windows。参见 Neo4j.rb version 3.0 slow performance RoR, over 1024ms for all queries。我们无法确定它。在本地,运行使用完全相同的查询,我第一次 运行 时看到 13 毫秒,此后每次看到 ~3 毫秒。索引不会对那么小的数据库产生影响。
限制出现问题的可能性并普遍提高性能的方法:
- 使用Ruby MRI 2.2.0
- 使用 Neo4j 2.1.6 或 2.2.0
- 使用Mac或Linux,而不是Windows
- 在您的应用中需要
oj
和oj_mimic_json
gem
如果您的数据库和应用程序服务器位于两个不同的网络中,您将看到类似查询的更长响应。
关于这个简单查询在 MongoDB 和 PostgreSQL 中要快得多的评论:是的,它将会如此。这两个 return 简单查询都比 Neo4j.rb 快,原因不少于两个:
- 用于连接到这些数据库的 Ruby gem 不使用 REST 接口,它们使用自定义二进制协议。
- 两者都针对 return 快速处理单个记录进行了优化,Neo 针对 return 快速处理大量记录进行了优化。
在发布 Neo4j.rb 4.0 之前,我针对 Postgres 和 MongoDB 进行了大量基准测试,发现了相同的结果:当 returning 单个对象时,它们会压垮我们。 (PostgreSQL 是一项了不起的通用技术。)但是,一旦您开始寻找相关对象,事情就会平衡,并且随着您增加复杂性,差异变得更加显着。不幸的是,我没有任何数字可以分享,但如果我有时间的话,我很快就会写一篇关于它的博客 post。