2019 ANTWOORD
Dit antwoord is voor MongoDB 4.2
Na het lezen van de vraag en de discussie tussen jullie, geloof ik dat het probleem is opgelost, maar optimalisatie is nog steeds een veelvoorkomend probleem voor iedereen die MongoDB gebruikt.
Ik had hetzelfde probleem en hier zijn de tips voor het optimaliseren van zoekopdrachten.
Corrigeer me als ik het mis heb :)
Indexen spelen een cruciale rol bij het snel uitvoeren van query's, aangezien indexen gegevensstructuren zijn die de gegevensset van de collectie kunnen opslaan in een vorm die gemakkelijk te doorkruisen is. Query's worden efficiënt uitgevoerd met behulp van indexen in MongoDB.
U kunt naar behoefte een ander type indexen maken. Lees hier meer over indexen, de officiële MongoDB-documentatie.
- Altijd gebruik $match voor $project , omdat filters extra documenten en velden uit de volgende fase verwijderen.
- Onthoud altijd dat indexen worden gebruikt door $match en $sort . Probeer dus een index toe te voegen aan de velden waarop u documenten gaat sorteren of filteren.
- Probeer deze volgorde in uw zoekopdracht te behouden, gebruik $sort voor $limit zoals $sort + $limit + $skip. Omdat $sort gebruik maakt van de index en MongoDB in staat stelt het vereiste queryplan te selecteren tijdens het uitvoeren van de query.
- Altijd gebruik $limit voor $skip zodat overslaan wordt toegepast om documenten te beperken.
- Gebruik $project om in de volgende fase alleen de benodigde gegevens te retourneren.
-
Altijd maak een index op de ForeignField-attributen in een $lookup . Omdat lookup een array produceert, wikkelen we deze over het algemeen in de volgende fase af. Dus, in plaats van het in de volgende fase af te wikkelen, wikkel het dan af in de lookup zoals:
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Gebruik allowDiskUse in aggregatie, met behulp hiervan kunnen aggregatiebewerkingen gegevens schrijven naar de submap _tmp in de map Database Path. Het wordt gebruikt om de grote query op de tijdelijke map uit te voeren. Bijvoorbeeld:
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
Als u vaak indexen maakt en verwijdert, bouw dan uw indexen opnieuw op. Het helpt MongoDB om het eerder opgeslagen queryplan in de cache te vernieuwen, die het vereiste queryplan blijft overnemen, geloof me, dat probleem is waardeloos :(
Te veel indexen nemen te veel tijd in beslag bij het maken, bijwerken en verwijderen, omdat ze samen met hun taken een index moeten maken. Dus ze verwijderen helpt veel.
In een realistisch scenario helpt het niet om volledige gegevens in de database op te halen. U kunt het ook niet weergeven of de gebruiker kan de volledige opgehaalde gegevens niet lezen. Dus, in plaats van volledige gegevens op te halen, haalt u gegevens op in brokken, zodat zowel u als uw klant die gegevens kunnen bekijken.
En als laatste kijken welk uitvoeringsplan door MongoDB is geselecteerd, helpt bij het uitzoeken van het belangrijkste probleem. Dus $explain zal je helpen om dat uit te zoeken.
Ik hoop dat deze samenvatting jullie zal helpen, voel je vrij om nieuwe punten voor te stellen als ik er een heb gemist. Ik zal ze ook toevoegen.