0

MongoChef で遊んでみると、コレクション内のドキュメントの量と時間の経過とともにクエリが遅くなっていることを発見しました。例: 昨年 11 月にアプリを開始し、その時点から同じコレクション内の mongo DB に有効期限なしでデータを保存しています。

今、私はこのクエリを実行します:

{ "mongoTime": { $gte: "2015-09-01T15:46:51+0200" }, $and: [ { "mongoTime": { $lt: "2015-11-01T15:46:51+0200" } } ] }

2 か月間に 0.178 秒で 239,691 ドキュメントを取得しています。

しかし:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] }

3 日間で 6.391 秒で 199 909 ドキュメントを取得しています。

違い: 最初のクエリは最初に Mongo に挿入されたすべてのドキュメントを取得し、2 番目のクエリは過去 3 日間から現在までのすべてのドキュメントを取得します。

もちろん、コレクションにはすでに数百万のドキュメントがあります。この問題に対処する方法についてのアドバイスを読みたいと思います。インデックスの使用について考えました:次のようなもの:

db.clicks.createIndex( { "mongoTime": 1 } ) 

また

db.clicks.createIndex( { "mongoTime": -1 } )

ただし、このコレクションのインデックスの更新には時間がかかるため、エラーが発生する前に確認することをお勧めします。インデックスは書き込みパフォーマンスにも影響を与える可能性があります。

前もって感謝します。

正解を読んでインデックスを適用した後:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] }

3 日間、0.194 秒で 199 909 ドキュメントを取得しています。

大きな改善。ありがとう...

4

1 に答える 1

2
db.clicks.createIndex( { "mongoTime": 1 } ) 

はい、このインデックスは、提供したクエリのパフォーマンスを劇的に向上させます。MongoDB は、クエリのフィルタリング条件をより効果的にチェックできます。コレクション内の各ドキュメントを調べる代わりに、B ツリーインデックスを調べるので、アクセスする必要があるノードの数が大幅に削減されます。

ところで、あなたは$and正しく使用していません。適切な方法は次のとおりです。

{ $and: [
    { "mongoTime": { $gte: "2016-01-27T00:00:00+0000" } },
    { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } }
] }
于 2016-01-29T13:04:09.560 に答える