Portanto, consultas de intervalo duplo são desaconselhadas no Mongo. Suponho que você tenha um único índice contendo tanto
{start_ip_num: 1, end_ip_num: 1}
. Se isso não o aproximar o suficiente (muitas vezes ainda é lento se você tiver dados suficientes retornados pelo primeiro campo, já que ele precisa fazer muitas varreduras de árvore B), há um truque que você pode fazer para combater isso usando consultas de caixa 2D (só funciona para dois intervalos por vez).
Basicamente, você coloca um índice geográfico 2D em um campo contendo os dois pontos em uma matriz, como [start_ip, end_ip], e dá a ele um valor mínimo/máximo alto o suficiente para que ele não atinja os limites que são, por padrão, apenas -180/180.
Por fim, use uma consulta de limites com o intervalo que vai de min ao valor $lte em um canto da caixa e o valor gt e max no outro canto da caixa. Consulte http://www.mongodb.org/display/DOCS/ Geoespacial+Indexação#GeoespacialIndexing-BoundsConsultas para sintaxe.
Parece algo assim:
db.ip_ranges.find({ip_range:{$within:{$box:[[0, 1204135028], [1204135028, max]]}}});
onde max é o maior ip que você pode ter.
Já faz um tempo desde que eu olhei isso, então a caixa pode estar errada, mas o conceito é sólido, e isso fez com que as consultas de intervalo duplo tenham um desempenho um pouco melhor do que com um índice regular de árvore B de dois campos. Consistentemente em menos de um segundo (embora geralmente algumas centenas de ms), em comparação com alguns segundos com o índice normal - acho que tinha centenas de milhões de documentos na época, mas já faz um tempo, então leve esses benchmarks lembrados com um grão de sal. Os resultados variam muito dependendo dos seus dados e tamanhos de intervalo, tenho certeza.
Atualização: Você pode querer experimentar os
bits
configuração, tentando um número baixo e um número alto para ver se faz diferença. Para mim, isso não pareceu afetar as consultas em média. Consulte http://www.mongodb.org/display/DOCS/ Geoespacial+Indexação#GeoespacialIndexação-Criando o Índice
para sintaxe.