13

名前、著者、価格、出版社などの本のメタデータをmongodbドキュメントに保存しています。私はこれらのドキュメントを約1,000万個持っており、それらはすべて1つのコレクションに含まれています。ドキュメントの平均サイズは1.9KBです。name今、私は、、authorsおよびにインデックスを持っていますprice。実際、私は価格に2つのインデックスを持っています。1つは昇順で、もう1つは降順です。私のmongodbバージョンは2.2.0で、phpドライバーを使用してmongoにクエリを実行しています。ドライバーのバージョンは1.12です。しかし、価格について範囲クエリを実行すると、が表示されますMongoCursorTimeoutException。私のクエリでは、「価格が1000未満で500を超える」などの特定の価格帯の本を見つけようとしています。

タイムアウトを増やすのは良い考えではないようです(すでに30秒です)。クエリプロセスを高速化するために他にできることはありますか?

編集 実際に私の物価指数は複合です。整数値のステータスフィールドがあるので、価格インデックスは次のよう{price:-1,status:1}になり{price:1,status:1} ます。また、PHPを使用して一度に20個のドキュメントを取得しようとしています。

4

3 に答える 3

5

単一/共有サーバーと、従来のEBSボリュームとSSD EBSボリュームの両方を使用するEC2の専用レプリカセットの両方を使用した、数百万のドキュメントを含むMongoコレクションで多くの経験があります。ワークロードはさまざまです。分析指向のものもあれば、Webリクエストを支援するものもあります。これが私がお勧めする根本原因分析パスです:

  1. でクエリを実行して.explain()、使用されているインデックスなどの観点から何が起こっているかを確認します。必要に応じてインデックスを調整します。Mongoのオプティマイザーはかなり単純なので、インデックスがクエリパターンと完全に一致しない場合、それらが見落とされる可能性があります。

  2. MMSを確認し、次の問題のいずれかを探します。(1)メモリ内のすべてのデータ(ページフォールトによって示される)および(2)キューの長さ(通常、ある種のボトルネックを示す)。データベースに単一のグローバルロックがあり、特にクラウドでストレージにアクセスすることは悪いニュースであるため、すべてのデータがメモリにあるわけではない場合、Mongoのパフォーマンスは急速に低下します。最近、SSDクラウドストレージにアップグレードしました。サイズが約1/2 Tbのデータベースでは、パフォーマンスが3〜10倍向上しています。

  3. プロファイリングレベルを2(最大)に上げ、しばらく実行して、操作ログを確認します。MongoDBプロファイラーを参照してください。

お役に立てれば。

于 2012-10-13T05:56:28.620 に答える
2
  1. あなたの不名誉をチェックしてください。データのインデックスを再作成し、クエリを実行する前にコレクションが完全にインデックスに登録されていることを確認してください。(10マイルのドキュメントはインデックス作成に時間がかかる場合があります)
  2. インデックス付きクエリの中で最も遅い部分は、実際のドキュメント検索です。プルするドキュメントの量によっては、30秒以上かかる可能性があり、多くのメモリが必要になると想像できます。

いくつかのことに関するより役立つ手順については、このページをチェックしてみてください: http ://www.mongodb.org/display/DOCS/Optimization

10マイル。コンピュータ間でデータをシャーディングすることについても考えるかもしれないドキュメント。ハードドライブの読み取りはCPUサイクルよりも遅いことに注意してください。

于 2012-09-21T18:22:18.197 に答える
1

@JohnyHKが言ったように、私のRAMは低すぎました。それでそれを12GBに増やして、それは今動作します。コメントと回答をありがとうございました

于 2012-12-21T17:03:02.867 に答える