ODPOVĚĎ 2019
Tato odpověď je pro MongoDB 4.2
Po přečtení otázky a diskuzi mezi vámi věřím, že problém je vyřešen, ale optimalizace je stále běžným problémem pro všechny, kteří používají MongoDB.
Setkal jsem se se stejným problémem a zde jsou tipy pro optimalizaci dotazů.
Opravte mě, pokud se mýlím :)
1. Přidat index ke kolekci
Indexy hrají zásadní roli při rychlém spouštění dotazů, protože indexy jsou datové struktury, které mohou ukládat sadu dat kolekce ve formě, kterou lze snadno procházet. Dotazy jsou efektivně prováděny pomocí indexů v MongoDB.
Podle potřeby můžete vytvořit jiný typ indexů. Další informace o indexech naleznete zde, v oficiální dokumentaci MongoDB.
2. Optimalizace potrubí
- Vždy použijte $match před $project , protože filtry odstraňují další dokumenty a pole z další fáze.
- Vždy si pamatujte, že indexy používají $match a $sort . Zkuste tedy k polím, podle kterých budete dokumenty třídit nebo filtrovat, přidat index.
- Zkuste ve svém dotazu zachovat tuto sekvenci, použijte $sort před $limit jako $sort + $limit + $skip. Protože $sort využívá index a umožňuje MongoDB vybrat požadovaný plán dotazů při provádění dotazu.
- Vždy použijte $limit před $skip takže toto přeskočení bude použito pro omezení dokumentů.
- Použijte $project aby v další fázi vrátila pouze nezbytná data.
-
Vždy vytvářejte index pro atributy ForeignField v $lookup . Protože vyhledávání vytváří pole, obvykle je v další fázi rozbalíme. Takže místo odvíjení v další fázi to rozbalte ve vyhledávání jako:
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Použijte allowDiskUse v agregaci, s její pomocí mohou agregační operace zapisovat data do podadresáře _tmp v adresáři Database Path. Používá se k provedení velkého dotazu na dočasný adresář. Například:
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
3. Znovu sestavit indexy
Pokud vytváříte a odstraňujete indexy poměrně často, vytvořte je znovu. Pomáhá MongoDB obnovit dříve uložený plán dotazů v mezipaměti, která neustále přebírá požadovaný plán dotazů, věřte mi, že je to na hovno :(
4. Odstraňte nežádoucí indexy
Příliš mnoho indexů zabírá příliš mnoho času v operaci Vytvořit, Aktualizovat a Odstranit, protože potřebují vytvořit index spolu se svými úkoly. Takže jejich odstranění hodně pomůže.
5. Omezení dokumentů
Ve scénáři reálného světa načítání úplných dat přítomných v databázi nepomůže. Také je nemůžete zobrazit nebo uživatel nemůže číst kompletní načtená data. Místo načítání úplných dat tedy načtěte data po částech, což vám i vašemu klientovi pomůže tato data sledovat.
A nakonec sledování toho, jaký plán provádění vybírá MongoDB, pomáhá při zjišťování hlavního problému. $explain vám tedy pomůže v tom zjistit.
Doufám, že vám toto shrnutí pomůže, pokud jsem nějaké přehlédl, klidně navrhněte nové body. Také je přidám.