sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur optimerar man MongoDB-frågan med både $gt och $lte?

Så, frågor med dubbla intervall är olämpliga i Mongo. Jag antar att du har ett enda index som innehåller både {start_ip_num: 1, end_ip_num: 1} .

Om det inte kommer dig tillräckligt nära (ofta är det fortfarande långsamt om du har tillräckligt med data som returneras av det första fältet, eftersom det måste göra mycket B-trädskanning), finns det ett knep du kan göra för att bekämpa detta med 2D-boxfrågor (fungerar bara för två intervall åt gången).

I grund och botten sätter du ett 2D geo-index på ett fält som innehåller de två punkterna i en array, som [start_ip, end_ip], och ger det ett tillräckligt högt min/max-värde så att det inte når gränserna som är som standard bara -180/180.

Använd slutligen en gränsfråga med intervallet från min till $lte-värdet i ett hörn av rutan, och gt-värdet och maxvärdet i det andra hörnet av rutan. Se http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries för syntax.

Det ser ut ungefär så här:

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

där max är den största ip du kan ha.

Det var ett tag sedan jag tittade på det här, så rutan kan ha fel, men konceptet är bra, och det gjorde att frågorna med dubbla intervall presterade lite bättre än med ett vanligt tvåfälts B-trädindex. Konsekvent under en sekund (men vanligtvis några hundra ms), jämfört med några sekunder med det vanliga indexet - jag tror att jag hade hundratals miljoner dokument vid den tiden, men det har gått ett tag så ta dessa minns riktmärken med en korn av salt. Resultaten kommer att variera mycket beroende på dina data och intervallstorlekar, det är jag säker på.

Uppdatering: Du kanske vill experimentera med bits inställning, prova ett lågt och ett högt nummer för att se om det gör någon skillnad. För mig verkade det inte påverka frågorna i genomsnitt. Se http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-CreatingtheIndex för syntax.



  1. MongoDB SSPL-licensändringsuppdatering

  2. nextjs importera men anropa inte funktionskast Modulen hittades inte:Fel:Kan inte lösa 'dns'

  3. Hur ansluter jag till mongodb med sailsjs v0.10?

  4. Några detaljerade och specifika skäl till varför MongoDB är mycket snabbare än SQL DB?