1. ホーム
  2. mongodb

MongoDB {集計 $match} と {find} の速度比較

2023-11-29 23:21:05

質問

数百万行のmongoDBコレクションを持っていて、クエリを最適化しようとしています。私は現在、データを取得し、私が望むようにそれらをグループ化するために集約フレームワークを使用しています。私の典型的な集約クエリは次のようなものです。 $match > $group > $ group > $project

しかし、私は最後の部分が数ミリ秒しかかからず、最初が最も遅いことに気づきました。

私は $match フィルタのみを使用してクエリを実行し、次に collection.find で同じクエリを実行しようとしました。集計クエリは ~80ms かかるのに対し、検索クエリは 0 か 1ms しかかかりません。

私はかなり多くのフィールドにインデックスを持っているので、これは問題ではないでしょう。何が問題なのか、何か考えがありますか? それとも、集約フレームワークの通常の欠点なのでしょうか?

集約クエリの代わりに検索クエリを使用することができますが、リクエストの後に多くの処理を実行する必要があり、この処理を素早く行うには $group などで素早く処理できるので、アグリゲーションフレームワークを維持したいです。

ありがとうございます。

EDIT :

以下は私の基準です。

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}

どのように解決するのですか?

の主な目的は aggregation framework は、大量のエントリのクエリを容易にし、あなたにとって価値のある少数の結果を生成することです。

おっしゃるとおり、複数の find クエリを使用することもできますが、その場合は find クエリで新しいフィールドを作成することはできないことを覚えておいてください。一方 $group ステージでは、新しいフィールドを定義することができます。

の機能を実現したいのであれば aggregation framework の機能を実現したい場合、ほとんどの場合、最初に find (を実行し、その情報を引き出して、さらにプログラミング言語で操作する必要があります。

aggregation pipeline は時間がかかるように見えるかもしれませんが、少なくとも、1 つのシステム (MongoDB エンジン) のパフォーマンスだけを考慮すればよいことは分かっています。

から返されたデータを操作することになると、その分時間がかかります。 find クエリから返されたデータを操作するとなると、ほとんどの場合、さらにプログラミング言語でデータを操作する必要があり、選択したプログラミング言語の複雑さに応じて、複雑さが増していきます。