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

MongoDB samlet pipeline langsom efter første kamptrin

2019 SVAR

Dette svar er for MongoDB 4.2

Efter at have læst spørgsmålet og diskussionen mellem jer, tror jeg, at problemet er løst, men optimering er stadig et fælles problem for alle, der bruger MongoDB.

Jeg stod over for det samme problem, og her er tipsene til forespørgselsoptimering.

Ret mig, hvis jeg tager fejl :)

1. Tilføj indeks på indsamling

Indekser spiller en afgørende rolle i at køre forespørgsler hurtigt, da indekser er datastrukturer, der kan gemme samlingens datasæt i en form, der er nem at gennemse. Forespørgsler udføres effektivt ved hjælp af indekser i MongoDB.

Du kan oprette en anden type indekser efter dit behov. Lær mere om indekser her, den officielle MongoDB-dokumentation.

2. Pipeline optimering

  • Brug altid $match før $project , da filtre fjerner ekstra dokumenter og felter fra næste trin.
  • Husk altid, at indekser bruges af $match og $sort . Så prøv at tilføje et indeks til de felter, som du vil sortere eller filtrere dokumenter på.
  • Prøv at beholde denne rækkefølge i din forespørgsel, brug $sort før $limit gerne $sort + $limit + $skip. Fordi $sort udnytter indekset og tillader MongoDB at vælge den nødvendige forespørgselsplan, mens forespørgslen udføres.
  • Brug altid $limit før $spring så det spring vil blive anvendt for at begrænse dokumenter.
  • Brug $project for kun at returnere de nødvendige data i næste fase.
  • Opret altid et indeks på fremmedField-attributterne i et $lookup . Da opslag producerer et array, afvikler vi det generelt i næste fase. Så i stedet for at afvikle det i næste trin, skal du slappe af det inde i opslag som:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Brug allowDiskUse i aggregering kan aggregeringsoperationer ved hjælp af det skrive data til _tmp-underbiblioteket i databasestibiblioteket. Det bruges til at udføre den store forespørgsel på midlertidig bibliotek. For eksempel:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Genopbyg indekserne

Hvis du opretter og sletter indekser ret ofte, så genopbyg dine indekser. Det hjælper MongoDB med at opdatere den tidligere gemte forespørgselsplan i cachen, som bliver ved med at overtage den påkrævede forespørgselsplan, tro mig, det problem stinker :(

4. Fjern uønskede indekser

For mange indekser tager for meget tid i oprettelse, opdatering og sletning, da de skal oprette indeks sammen med deres opgaver. Så fjern dem hjælper meget.

5. Begrænsende dokumenter

I et scenarie i den virkelige verden hjælper det ikke at hente komplette data, der findes i databasen. Desuden kan du enten ikke vise det, eller også kan brugeren ikke læse fuldstændige hentede data. Så i stedet for at hente komplette data, skal du hente data i bidder, hvilket hjælper både dig og din klient med at se disse data.

Og til sidst hjælper det at se, hvilken eksekveringsplan der er valgt af MongoDB, med at finde ud af hovedproblemet. Så $explain vil hjælpe dig med at finde ud af det.

Håber dette resumé vil hjælpe jer. Du er velkommen til at foreslå nye punkter, hvis jeg gik glip af nogen. Jeg vil også tilføje dem.




  1. Introduktion til Redis

  2. Kører flere forekomster af Redis på Centos

  3. Hvad er forskellen mellem replaceOne() og updateOne() i MongoDB?

  4. Sådan fjerner du alle elementer fra en MongoDB-samling