sql >> データベース >  >> NoSQL >> MongoDB

$gtと$lteの両方でMongoDBクエリを最適化する方法は?

    そのため、Mongoではダブルレンジクエリはお勧めできません。 {start_ip_num: 1, end_ip_num: 1}の両方を含む単一のインデックスがあると仮定します 。

    それでも十分に近づかない場合(最初のフィールドから十分なデータが返される場合は、多くのBツリースキャンを実行する必要があるため、まだ遅いことがよくあります)、これに対抗するために実行できるトリックが1つあります。 2Dボックスクエリを使用します(一度に2つの範囲でのみ機能します)。

    基本的に、[start_ip、end_ip]のように、配列内の2つのポイントを含むフィールドに2Dジオインデックスを配置し、デフォルトでちょうど制限に達しないように、十分に高い最小/最大値を指定します。 -180/180。

    最後に、ボックスの一方の隅で最小値から$ lte値まで、ボックスのもう一方の隅でgtと最大値までの範囲で境界クエリを使用します。 http://www.mongodb.org/display/DOCS/を参照してくださいGeospatial + Indexing#GeospatialIndexing-BoundsQueries 構文について。

    次のようになります:

    db.ip_ranges.find({ip_range:{$within:{$box:[[0, 1204135028], [1204135028, max]]}}});
    

    ここで、maxは使用できる最大のIPです。

    これを見てからしばらく経ちましたので、ボックスが間違っている可能性がありますが、概念は適切であり、通常の2フィールドBツリーインデックスよりもダブルレンジクエリのパフォーマンスが少し向上しました。通常のインデックスの数秒と比較して、一貫して1秒未満(通常は数百ミリ秒)-当時は数億のドキュメントがあったと思いますが、しばらく経っているので、これらの記憶されたベンチマークを一目で確認してください塩の。結果はデー​​タと範囲のサイズによって大きく異なります。

    更新: bitsを試してみることをお勧めします 設定、低い数値と高い数値を試して、違いが生じるかどうかを確認します。私にとっては、平均してクエリに影響を与えることはなかったようです。 http://www.mongodb.org/display/DOCS/を参照してくださいGeospatial + Indexing#GeospatialIndexing-インデックスの作成 構文について。



    1. ネストされたオブジェクトでのMongoDbSpringの検索

    2. Beanstalkdと同様のCLIを使用してRedisをキューエンジンとして監視するにはどうすればよいですか?

    3. MongoDBでの全文検索では、@@@の期待される結果が得られません

    4. mongodbのコレクションの最大サイズはいくつですか