Mongodb lekérdezés teljesítmény tartományonként

Ha a MongoDB indexek területén keresztül utazott, előfordulhat, hogy hallottuk az elvet: Ha a lekérdezések tartalmaznak rendezést, akkor a leképezések során használt index végéhez soroljuk be a rendezett mezőt. Sok esetben, ha a lekérdezések olyan egyenlőségi feltételeket tartalmaznak, mint például az a szempont, hogy a fentiek nagyon hasznosak.


De mi a helyzet vele a következő példával?

Ez a köteg nem hatékony, bár az elv betartása. Mert van egy csapda, amelyben ez az elv vezethet. Az alábbiakban megvizsgáljuk a csapda meghibásodásának okait, és a cikk végére új szabály lesz, amely segít az indexelésben.

Emlékezzünk a MongoDB dokumentáció alapjaira:

Az indexek megfontolásra érdemelnek a tervezés elején. Az adatokhoz való hozzáférés történelmi, hatékonysága az adatbázis-adminisztrátorok felé tolódott el, ezáltal optimalizálási réteget hozott létre a tervezés után. Dokumentumorientált adatbázisok esetén ez elkerülhető.

Az indexelt lekérdezések több nagyságrenddel is jobban működnek, még kisebb adatok esetén is. Míg index nélkül a lekérdezés 10 másodpercet vesz igénybe, ugyanaz a lekérdezés 0 milliszekundumot vehet igénybe a megfelelő indexhez képest.

A lekérdezések balról jobbra indexeket használnak. Az index csak akkor használható, ha a lekérdezés az index minden mezőjét kihagyás nélkül használja.

Ha a lekérdezés tartalmaz rendezést, adja hozzá a rendezett mezőt az indexhez.

  • „Parancsok”
.explain () megmutatja, hogy mely index kerül felhasználásra ehhez a lekérdezéshez. ensureIndex () indexeket hoz létre. A getIndexes () és a .getIndexKeys () megmutatja, hogy mely indexek vannak.

Most vissza a kérdésünkre. Az indexelés alapja, a következő lekérdezésre:

Olyan indexet kell létrehoznunk:

Mi van akkor, ha a legtöbb lekérdezés az összehasonlítás helyett tartományválasztást használ? Mint ebben:

Itt használtuk a $ in operátort, de emellett vannak olyanok is, mint: $ gt, $ lt és mások.

Ha ezt a lekérdezést használja, látni fogod, hogy ez nem hatékony, és emlékszel az alapokra - meg kell futtatnia a .explain () függvényt, és meg kell néznie, hogy melyik indexet használják és hogyan.

A (z) .explain () végrehajtás eredményeképpen láthatja, hogy a MongoDB milyen típusú műveleteket végez, és ez egy drága művelet. A MongoDB a dokumentumokat a memóriába rendezi. Ezért elkerülni kell a nagy adatsorokat. lassú és erőforrás-igényes.

Ne felejtse el, miért lassú a scanAndOrder, miért rendezi MongoDB az eredményt, annak ellenére, hogy van már indexünk a válogatással? A válasz egyszerű: nincs megfelelő indexünk.

Miért? Az ok egyszerű, a lényeg az általunk létrehozott index szerkezetében. A fenti példában a dokumentumok és a dokumentumok rendezése az indexben történik, de egymástól függetlenül vannak rendezve. Nem rendezik össze őket! Vegye figyelembe az alábbi ábrát:


A bal oldali diagram a dokumentumok feltérképezésének sorrendjét mutatja az általunk létrehozott index szerint. Miután megtalálta az összes dokumentumot, azokat rendezni kell.

Jobbra, alternatív index <“carsOwned”: 1, “country”: 1>. Ebben az esetben a talált dokumentumok már rendezett formában lesznek.

A hatékonyságnak ez a finom pontja a következő indexelési szabályokat eredményezte:

A mezők sorrendje:

1. Először a mezőket a pontos értékek szerint választják ki.

2. További mezők, amelyeken a válogatás megtörténik.

3. És a mező végén a tartomány szűrő.

Van kompromisszum? Igen. A lekérdezés több index csomópontot is meglátogat, ami technikai jellegű. A rendezett rész megkerülése szűrés előtt. Így az új szabály nettó előnye sok lekérdezésnek, de ne felejtsük el, hogy az adatok összetettsége különböző eredményekhez vezethet.