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

Hvordan optimerer man MongoDB-forespørgsel med både $gt og $lte?

Så forespørgsler med dobbelt rækkevidde er dårlige i Mongo. Jeg antager, at du har et enkelt indeks, der indeholder både {start_ip_num: 1, end_ip_num: 1} .

Hvis det ikke kommer dig tæt nok på (ofte er det stadig langsomt, hvis du har nok data returneret af det første felt, da det skal lave en masse B-træ-scanning), er der et trick, du kan gøre for at bekæmpe dette ved hjælp af 2D-boksforespørgsler (virker kun for to områder ad gangen).

Grundlæggende sætter du et 2D geo-indeks på et felt, der indeholder de to punkter i et array, såsom [start_ip, end_ip], og giver det en høj nok min/max værdi, så det ikke rammer grænserne, som er som standard bare -180/180.

Brug endelig en bounds-forespørgsel med intervallet fra min til $lte-værdien i det ene hjørne af boksen, og gt-værdien og max-værdien i det andet hjørne af boksen. Se http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries til syntaks.

Det ser sådan ud:

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

hvor max er den største ip du kan have.

Det er et stykke tid siden, jeg har kigget på dette, så boksen kan være forkert, men konceptet er sundt, og det fik dobbeltrækkende forespørgsler til at fungere en smule bedre end med et almindeligt to felts B-træ indeks. Konsekvent under et sekund (selvom normalt et par hundrede ms) sammenlignet med et par sekunder med det almindelige indeks - jeg tror, ​​jeg havde hundreder af millioner af dokumenter på det tidspunkt, men det er et stykke tid siden, så tag disse huskede benchmarks med en kerne af salt. Resultaterne vil variere meget afhængigt af dine data og områdestørrelser, jeg er sikker på.

Opdatering: Du vil måske eksperimentere med bits indstilling, prøv et lavt tal og et højt tal for at se, om det gør en forskel. For mig så det ikke ud til at påvirke forespørgslerne i gennemsnit. Se http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-CreatingtheIndex til syntaks.



  1. Stubbing Redis-interaktioner i javascript ved hjælp af Sinon

  2. I Jongo, hvordan man finder flere dokumenter fra Mongodb ved hjælp af en liste over ID'er

  3. Hvad er Hadoop Mapper Class i MapReduce?

  4. Mongo DB-aggregering med en række objekter