Az N+1 lekérdezési problémához vezető általános hibák általában körül fordulnak, hogy az adatok hogyan kerülnek be egy adatbázisból, különösen akkor, ha objektum-relációs leképezés (ORM) keretrendszereket vagy adatbázis-lekérdezéseket használnak manuálisan. Itt vannak ezeknek a hibáknak a részletes magyarázata:
** 1. A kapcsolódó adatok letöltése külön lekérdezésekben
Az N+1 lekérdezési probléma elsődleges oka a kód felépítése, hogy először lekérjük a rekordok listáját egy lekérdezéssel, majd további lekérdezést hajtunk végre az egyes rekordokhoz a kapcsolódó adatok letöltéséhez. Például, hogy lekérdezzük a felhasználók listáját, majd az egyes felhasználókhoz külön lekérdezésre kerüljenek, 1 lekérdezést eredményeznek a felhasználók számára, plusz n lekérdezés a hozzászólásokhoz, ahol n a felhasználók száma. Ez sok apró lekérdezéshez vezet egy optimalizált lekérdezés helyett [1] [2] [3] [7].
** 2. Alapértelmezés szerint támaszkodva a lusta betöltésre
A legtöbb ORM a lusta betöltést használja alapértelmezett letöltési stratégiaként, ami azt jelenti, hogy a kapcsolódó entitások csak akkor kerülnek behozatalra, ha kifejezetten hozzáférnek. Noha ez erőforrásokat menthet, ha nincs szükség a kapcsolódó adatokra, ez több lekérdezést indít, amikor a gyűjtemények felett iterálódik, tudatosan az N+1 problémát okozza. Például, ha az egyes blogbejegyzések szerzőjéhez való hozzáférés külön -külön külön lekérdezést indít postánként [5].
** 3. A lekérdezések vakon újrafelhasználása kontextuális kiigazítások nélkül
Ugyanazon lekérdezés újrafelhasználása az alkalmazás különböző részein, testreszabás nélkül, szükségtelen adatkérelmet okozhat és súlyosbíthatja az N+1 problémát. Azok a lekérdezések, amelyeket nem optimalizáltak a speciális felhasználási esetekre, hiányos adatokat hozhatnak, és további kérdéseket kérhetnek a kapcsolódó információk későbbi letöltésére [8].
** 4. Nem használja a lelkes betöltési vagy lekérdezés optimalizálási technikákat
A lelkes betöltés elmulasztása (a kapcsolódó adatok leolvasása a kezdeti lekérdezésben) vagy az optimalizált csatlakozások több befordulási eredményt eredményeznek az adatbázisba. Ez akkor fordul elő, amikor a fejlesztők nem utasítják kifejezetten az ORM vagy a Query Builder -t, hogy töltsék össze a kapcsolódó entitásokat, és sok apró lekérdezést eredményeznek egyetlen, hatékonyság helyett [5] [6] [7].
** 5. Figyelmen kívül hagyva a több oda -vissza az adatbázisra gyakorolt hatást
A fejlesztők néha azt feltételezik, hogy sok apró kérdés gyorsabb, mint egy összetett lekérdezés, de minden lekérdezés magában foglalja a hálózati késéssel és a feldolgozással. Az N+1 lekérdezések kumulatív hatása szignifikánsan lelassítja az alkalmazás válaszidejét és növeli az adatbázis terhelését, különösen az adatmennyiség növekedésével [1] [3] [5].
** 6. A probléma tudatosságának vagy felismerésének hiánya
Mivel az N+1 mintázat minden egyes lekérdezése gyorsan fut, gyakran nem jelenik meg lassú lekérdezési naplókban vagy megfigyelő eszközökben, így csendes teljesítménygyilkos. Lehet, hogy a fejlesztők nem veszik észre a problémát, amíg az alkalmazás reagálása szignifikánsan romlik [2] [5] [7].
Összefoglalva: az N+1 lekérdezési probléma elsősorban a nem hatékony adatgyűjtési minták miatt merül fel, és a kapcsolódó adatok lekérdezését külön lekérdezések során az egyes rekordokhoz külön lekérdezésekhez vagy a lekérdezésekhez való csatlakozás helyett. Ezt gyakran az alapértelmezett lusta betöltés okozza az ORMS -ben, a lelkes betöltés vagy a tétel használatának elmulasztása, valamint az általános lekérdezések optimalizálás nélkül történő újrafelhasználása. Ennek eredményeként túlzott adatbázis -keresés, amely romlik a teljesítményt és a méretezhetőséget [1] [2] [3] [5] [6] [7].
Idézetek:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problemin-oMorm-object-reational-mapping
[3] https://www.pingcap.com/article/how-to-effiacty-solve-the-n1-query-problem/
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-n--how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-thetect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-7270527662970818561-ZMZ6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-pleformance-miller-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-Mistakes-for-better-database-management/