0

私は 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}

どこが問題になる可能性がありますか?

4

2 に答える 2

2

私は、上で回答した Brian Underwood とともに、Neo4j.rb の中心的なメンテナーの 1 人です。回答するにはシステムについてもっと知る必要があるため、これは完全な回答ではありませんが、1 つのコメントには多すぎるため、ここに投稿します。

私のお金は、あなたの DB またはシステムに問題があります。Windows を実行しているユーザーに対して、ローカルで作業しているときにクエリが遅く、原因を特定できないという同様の問題が報告されました。Neo4j.rb バージョン 3.0 の低パフォーマンス RoR、すべてのクエリで 1024 ミリ秒を参照してください。突き止めることができませんでした。ローカルでまったく同じクエリを実行すると、最初に実行したときは 13 ミリ秒、その後は毎回約 3 ミリ秒表示されます。それほど小さいDBでは、インデックスを作成しても違いはありません。

問題が発生する可能性を制限し、一般的にパフォーマンスを向上させる方法:

  • Ruby MRI 2.2.0 を使用
  • Neo4j 2.1.6 または 2.2.0 を使用
  • Windows ではなく、Mac または Linux を使用する
  • アプリでojoj_mimic_jsongem を必須にする

データベースとアプリ サーバーが 2 つの異なるネットワークにある場合、そのようなクエリの応答が長くなります。

この単純なクエリは MongoDB と PostgreSQL ではるかに高速であるというコメントについて: はい、そうなります。どちらも、以下の 2 つの理由により、Neo4j.rb よりも高速に単純なクエリを返します。

  • これらの DB に接続するための Ruby gem は REST インターフェイスを使用せず、カスタム バイナリ プロトコルを使用します。
  • どちらも単一のレコードをすばやく返すように最適化されており、Neo は大量のレコード グループをすばやく返すように最適化されています。

Neo4j.rb 4.0 をリリースする前に、Postgres と MongoDB に対して大量のベンチマークを実行しましたが、同じ結果が見つかりました。(PostgreSQL は驚くべき技術全般です。) ただし、関連するオブジェクトを探し始めるとすぐにバランスが取れ、複雑さが増すにつれて、違いはさらに大きくなります。残念ながら、共有できる数字はありませんが、時間があれば近いうちにブログに投稿します。

于 2015-02-02T22:47:55.633 に答える
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 に答える