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”
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.