sql >> Database >  >> NoSQL >> MongoDB

Hoe MongoDB-query optimaliseren met zowel $gt als $lte?

Dubbele bereikquery's zijn dus onverstandig in Mongo. Ik neem aan dat je een enkele index hebt die zowel {start_ip_num: 1, end_ip_num: 1} bevat .

Als dat je niet dichtbij genoeg brengt (vaak is het nog steeds traag als je genoeg gegevens hebt geretourneerd door het eerste veld, omdat het veel B-tree-scanning moet doen), is er één truc die je kunt doen om dit te bestrijden met behulp van 2D-boxquery's (werkt slechts voor twee bereiken tegelijk).

Kortom, je plaatst een 2D-geo-index op een veld dat de twee punten in een array bevat, zoals [start_ip, end_ip], en geeft het een min/max-waarde die hoog genoeg is zodat het de limieten niet bereikt die standaard gewoon zijn -180/180.

Gebruik ten slotte een begrenzingsquery met het bereik van min tot de $lte-waarde in de ene hoek van de box, en de gt- en de max-waarde in de andere hoek van de box. Zie http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries voor syntaxis.

Het ziet er ongeveer zo uit:

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

waarbij max het grootste ip is dat je kunt hebben.

Het is een tijdje geleden dat ik hier naar heb gekeken, dus de box kan verkeerd zijn, maar het concept is goed, en het zorgde ervoor dat de dubbele bereikquery's een beetje beter presteerden dan met een gewone B-tree-index met twee velden. Consistent minder dan een seconde (hoewel meestal een paar honderd ms), vergeleken met een paar seconden met de reguliere index - ik denk dat ik destijds honderden miljoenen documenten had, maar het is al een tijdje geleden, dus neem deze herinnerde benchmarks met een korreltje van zout. De resultaten zullen sterk variëren, afhankelijk van je gegevens en bereikgroottes, daar ben ik zeker van.

Bijwerken: Misschien wilt u experimenteren met de bits instelling, probeer een laag nummer en een hoog nummer om te zien of het een verschil maakt. Voor mij leek het gemiddeld geen invloed te hebben op de vragen. Zie http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-CreatingtheIndex voor syntaxis.



  1. Vergelijk datum (moment.js) in MongoDB

  2. Hoe kan ik terugdraaien in transacties in mongo bereiken?

  3. LEFT JOIN with GROUP by in MongoDB

  4. Hoe het type van een veld wijzigen?