sql >> Databáze >  >> NoSQL >> MongoDB

Jak optimalizovat dotaz MongoDB s $gt i $lte?

Dotazy s dvojitým rozsahem jsou tedy v Mongu nerozumné. Předpokládám, že máte jeden index obsahující obě {start_ip_num: 1, end_ip_num: 1} .

Pokud se tím nedostanete dostatečně blízko (často je to stále pomalé, pokud máte dostatek dat vrácených prvním polem, protože musí provést mnoho skenování B-stromu), existuje jeden trik, který můžete udělat, abyste s tím bojovali. pomocí 2D boxových dotazů (funguje pouze pro dva rozsahy najednou).

V podstatě umístíte 2D geo index na pole obsahující dva body v poli, jako je [start_ip, end_ip], a přidělíte mu dostatečně vysokou minimální/maximální hodnotu, aby nenarazil na limity, které jsou ve výchozím nastavení pouze -180/180.

Nakonec použijte dotaz na hranice s rozsahem od min do hodnoty $lte v jednom rohu pole a hodnoty gt a max v druhém rohu pole. Viz http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries pro syntaxi.

Vypadá to nějak takto:

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

kde max je největší IP, kterou můžete mít.

Je to už nějakou dobu, co jsem se díval na toto, takže pole může být špatné, ale koncept je dobrý a dotazy s dvojitým rozsahem dosahovaly o něco lepšího výkonu než s běžným indexem dvou polí B-stromu. Konzistentně pod sekundu (ačkoli obvykle několik set ms), ve srovnání s několika sekundami s běžným indexem – myslím, že jsem v té době měl stovky milionů dokumentů, ale už je to nějaký čas, takže tyto zapamatované benchmarky berte s rezervou soli. Jsem si jistý, že výsledky se budou značně lišit v závislosti na vašich datech a velikosti rozsahu.

Aktualizace: Možná budete chtít experimentovat s bits nastavení, vyzkoušejte nízké a vysoké číslo, abyste zjistili, zda je to rozdíl. Zdá se mi, že to v průměru neovlivňuje dotazy. Viz http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-CreatingtheIndex pro syntaxi.



  1. Generování struktury pro agregaci

  2. OAuth 2.0 – Kdy by měl být přístupový token obnoven s obnovovacím tokenem?

  3. Jak agregovat na obrovském poli v mongoDB?

  4. Jaké mohou být výhody a nevýhody plochých dokumentů Embedded Arrays VS v mongodb?