MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come ottimizzare la query MongoDB con $ gt e $ lte?

Quindi, le query a doppio intervallo sono sconsiderate in Mongo. Presumo che tu abbia un singolo indice contenente entrambi {start_ip_num: 1, end_ip_num: 1} .

Se ciò non ti avvicina abbastanza (spesso è ancora lento se hai abbastanza dati restituiti dal primo campo, poiché deve eseguire molte scansioni dell'albero B), c'è un trucco che puoi fare per combattere questo utilizzando query box 2D (funziona solo per due intervalli alla volta).

Fondamentalmente, metti un indice geografico 2D su un campo contenente i due punti in un array, come [ip_iniziale, ip_finale], e gli dai un valore min/max sufficientemente alto in modo che non raggiunga i limiti che per impostazione predefinita sono solo -180/180.

Infine, usa una query bounds con l'intervallo che va da min al valore $lte su un angolo della scatola e il valore gt e max sull'altro angolo della scatola. Vedi http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQuery per la sintassi.

Sembra qualcosa del genere:

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

dove max è l'ip più grande che puoi avere.

È passato un po' di tempo dall'ultima volta che ho cercato questo, quindi la scatola potrebbe essere sbagliata, ma il concetto è valido e ha reso le query a doppio intervallo un po' migliori rispetto a un normale indice B-tree a due campi. Costantemente meno di un secondo (anche se di solito poche centinaia di ms), rispetto a pochi secondi con l'indice normale - penso di avere centinaia di milioni di documenti in quel momento, ma è passato del tempo, quindi prendi questi benchmark ricordati con un grano di sale. I risultati varieranno notevolmente a seconda dei dati e delle dimensioni dell'intervallo, ne sono sicuro.

Aggiornamento: Potresti voler sperimentare con i bits impostazione, provando un numero basso e uno alto per vedere se fa la differenza. Per me, in media non sembrava influenzare le query. Vedi http://www.mongodb.org/display/DOCS/ Geospaziale+Indicizzazione#GeospazialeIndicizzazione-Creazione dell'indice per la sintassi.