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

Mongo-forespørgsler tager lang tid. Hvordan gøre det hurtigere?

Indekset skal dække alle dele af forespørgslen (lighedsdel, sorteringsdel og rækkeviddedel). Dette skyldes, at i en typisk find() forespørgsel, MongoDB bruger kun ét indeks. F.eks. bruger den generelt ikke ét indeks til ligestillingsdelen og et andet indeks til sorteringsdelen.

Generelt skal rækkefølgen af ​​felter i indekset følge mønsteret equality -> sort -> range .

Dette er beskrevet detaljeret i Optimering af MongoDB Compound Indexes .

For din forespørgsel er ligestillingsdelen tag:..., letterId:... og sorteringsdelen er emailId:-1 . Der er ingen rækkevidde i din forespørgsel.

Ved at bruge dette mønster er det sammensatte indeks, du har brug for:

db.test.createIndex({tag:1, letterId:1, emailId:-1})

Lad os prøve at bekræfte, hvor meget ydelsesforbedring vi kan få ved at bruge dette indeks.

Testdata

For at bekræfte indeksets egnethed indsatte jeg 1 million poster i en testdatabase ved hjælp af mgeneratejs , som er et værktøj til at oprette et tilfældigt dokument ved hjælp af en skabelon.

Baseret på dit eksempel er mgeneratejs skabelon jeg bruger er:

$ cat template.json
{
  "emailId": "$hash",
  "email": "$email",
  "letterId": "$hash",
  "sendedFrom": "$email",
  "resultMsg": "$word",
  "owner": "$name",
  "created": "$date",
  "result": "$bool",
  "tag": "$word",
  "tryNum": {"$integer": {"min": 0, "max": 1e3}},
  "clickHash": "$word",
  "links": {"$array": {"of": "$url", "number": {"$integer": {"min": 1, "max": 5}}}}
}

og importerede 1 million tilfældige dokumenter til MongoDB:

$ mgeneratejs template.json -n 1000000 | mongoimport -d test -c test

Test 1:ikke-optimalt indeks

Så opretter jeg det indeks, du har, og forsøgte at finde et ikke-eksisterende dokument og samlede 10 kørsler af forespørgslen med samlingen, der kun indeholdt dette indeks:

> db.test.createIndex({emailId: 1, letterId: 1, result: 1, owner: 1, tag: 1, clickHash: 1})

> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 3069ms
Fetched 0 record(s) in 2924ms
Fetched 0 record(s) in 2923ms
Fetched 0 record(s) in 3013ms
Fetched 0 record(s) in 2917ms
Fetched 0 record(s) in 2961ms
Fetched 0 record(s) in 2882ms
Fetched 0 record(s) in 2870ms
Fetched 0 record(s) in 2969ms
Fetched 0 record(s) in 2863ms

så ved at bruge det indeks er forespørgslens svartid ikke store, med de fleste udførelse tæt på 3 sekunder.

Test 2:lighed -> sortering -> områdeindeks

Ved at tilføje det optimale lighed -> sorter -> interval indeks:

> db.test.createIndex({tag:1, letterId:1, emailId:-1})

> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 2ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 3ms

I modsætning hertil blev ydeevnen markant forbedret ved at bruge det optimale indeks. Ingen forespørgsel returneres på mere end 3 ms, og det meste af tiden returneres efter 1 ms.



  1. Find nøgler ved hjælp af jokertegn

  2. mongoDB sharding eksempel

  3. Vedligeholdelse af MongoDB Replica Sets i skyen ved hjælp af Ansible

  4. MongoDB $dateToString Format Specifiers