Ho la seguente query che è un po 'come un campo di ricerca inversa:
db.ip_ranges.find({ $and: [{ start_ip_num: { $lte: 1204135028 } }, { end_ip_num: { $gt: 1204135028 } }] })
Quando viene eseguito con solo l'identificatore LTE $, la query restituisce subito. Ma quando corro con $ gt e $ lte nella stessa query, è estremamente lento (in secondi).
Sia i campi start_ip_num che end_ip_num sono indicizzati.
Come posso ottimizzare la ricerca?
EDIT
ricevo il seguente quando uso la funzione spiegare() sulla query:
{
"cursor" : "BtreeCursor start_ip_num_1",
"nscanned" : 452336,
"nscannedObjects" : 452336,
"n" : 1,
"millis" : 2218,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"start_ip_num" : [
[
-1.7976931348623157e+308,
1204135028
]
]
}
}
EDIT 2
Una volta ho aggiunto l'indice composto, il La funzione explain() restituisce quanto segue:
{
"cursor" : "BtreeCursor start_ip_num_1_end_ip_num_1",
"nscanned" : 431776,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 3433,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"start_ip_num" : [
[
-1.7976931348623157e+308,
1204135028
]
],
"end_ip_num" : [
[
1204135028,
1.7976931348623157e+308
]
]
}
}
Tuttavia, il perf è ancora scarso (in secondi).
Un '' .find ({...}). Explain() '' è un buon punto di partenza. Come chiede Wes Freeman, hai un indice su '' {start_ip_nm: 1, end_ip_num: 1} ''? – slee
Una cosa che dovresti risolvere potrebbe aiutarti a usare un singolo oggetto selettore di query invece di usare '$ e'. 'db.ip_ranges.find ({start_ip_num: {$ lte: 1204135028}, end_ip_num: {$ gt: 1204135028}})' – JohnnyHK
L'albero B deve scansionare> 400k voci per trovare l'unica corrispondenza. Prova la query sulla casella per vedere se questo aiuta. Scommetto che lo farai meno di un secondo. –