そのため、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-インデックスの作成
構文について。