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

Jak urychlit mongo dotaz

Několik věcí, které můžete udělat zde:

Nejprve použijte $in místo $or.

Za druhé, MongoDB umí pouze použijte index pro svou první shodu, takže se budete muset rozhodnout (vyzkoušením), která ze dvou shod je lepší. Cílem je mít tak rychlý dotaz a co méně dokumentů procházejících vaším kanálem. Pro to uděláte následující věci:

Nejprve vytvořte tři indexy:

db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );

Poté spusťte následující tři dotazy a všimněte si polí "kurzor", "n", "nScanned" a "ms":

branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();

U posledního dotazu si všimnete, že "cursor" je "BasicCursor", protože $ne dotaz nemůže použít index.

Další dva vám zobrazí různé hodnoty pro „ms“, „n“ a „nScanned“. "ms" je doba potřebná ke spuštění dotazu. Pokud je to přibližně stejné, podívejte se na rozdíl mezi hodnotami "n" a "nScanned". Budu očekávat a odhadovat, že rozdíl pro dotaz „versions.branch“ je 0. U dotazu „doctype“ to může být jiné. Pokud „ms“ není přibližně stejné, zadejte $match, který byl nejrychlejší nejprve jako $match clause ve vašem agregačním kanálu.

Pokud jsou obě rychlosti ("ms") stejné, zkontrolujte hodnoty "n". Pokud je "n" pro dotaz "prefix" řekněme "5" a "n" pro dotaz "versions.branch" je "500", znamená to, že výsledek dotazu "prefix" je lepší, protože méně dokumenty jsou vráceny. V takovém případě to uveďte jako svou první $match klauzuli v souhrnu. Pokud je "versions.branch" mnohem menší, použijte tuto klauzuli jako první $match klauzuli.




  1. Použití AngularJs a MongoDB/Mongoose

  2. Python + Memcached:Efektivní ukládání do mezipaměti v distribuovaných aplikacích

  3. Najděte maximální prvek uvnitř pole

  4. Jak povolit TLS pro Redis 6 na Sidekiq?