Rozpoznawanie problemu N+1
Rozpoznawanie klasycznej pułapki zapytania dla każdego wiersza
Rozpoznawanie problemu N+1 to bezpłatna lekcja Django Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Django Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Django Academy zawiera 4 lekcji w sumie.
Co oznacza N+1
Problem N+1 występuje, gdy kod wykonuje jedno zapytanie w celu pobrania listy, a następnie po jednym dodatkowym zapytaniu dla każdego elementu tej listy. 🐢
Gdzie się ukrywa
Zwykle ukrywa się w pętli iterującej po obiektach, gdy każda iteracja ponownie sięga do powiązanego wiersza w bazie danych.
Mały przykład
Proszę wyobrazić sobie wyświetlanie książek i wypisywanie autora każdej z nich. Poniższa pętla wygląda niewinnie, ale w każdej linii uruchamia nowe zapytanie.
for book in Book.objects.all():
print(book.author.name)Zliczanie zapytań
Jedno zapytanie ładuje wszystkie książki. Następnie każdy dostęp do book.author wykonuje własne zapytanie, więc 100 książek oznacza 101 komunikacji z bazą danych.
Dlaczego 1, a potem N
Stąd nazwa: 1 zapytanie o listę obiektów nadrzędnych oraz N dodatkowych zapytań — po jednym dla każdego użytego obiektu powiązanego.
Przyczyną jest leniwe ładowanie
Django ładuje powiązane wiersze leniwe, dopiero gdy są potrzebne. Jest to wygodne dla jednego obiektu, ale problematyczne przy dostępie wewnątrz pętli.
Źle się skaluje
Problem narasta wraz z ilością danych. Dziesięć wierszy nie sprawia kłopotu, ale dziesięć tysięcy zmienia jedno ładowanie strony w lawinę zapytań.
Szablony również mogą go wywołać
Szablon wyświetlający powiązane dane wewnątrz pętli for powoduje dokładnie tę samą lawinę, nawet jeśli nie widzą Państwo pętli w kodzie Pythona.
{% for book in books %}
{{ book.author.name }}
{% endfor %}Jak go rozpoznać
Proszę zwrócić uwagę na dostęp do powiązanego obiektu, taki jak obj.parent, wykonywany wewnątrz pętli. Ten schemat zawsze jest sygnałem ostrzegawczym.
Uwidacznianie zapytań
Podczas DEBUG można bezpośrednio zliczać zapytania za pomocą connection.queries, aby sprawdzić, ile komunikacji z bazą danych rzeczywiście wykonuje widok.
from django.db import connection
print(len(connection.queries))Dobra wiadomość
Gdy problem staje się widoczny, Django udostępnia dwa narzędzia, które pozwalają ograniczyć wszystkie te zapytania do zaledwie kilku. Poznają je Państwo za chwilę. 🚀
Szybkie sprawdzenie
Upewnijmy się, że wzorzec N+1 jest jasny.
Podsumowanie
Problem N+1 to jedno zapytanie o listę oraz po jednym zapytaniu dla każdego obiektu powiązanego, spowodowane leniwym ładowaniem wewnątrz pętli. Można go rozpoznać, obserwując dostęp do obiektów powiązanych w pętli. ✅
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Rozpoznawanie problemu N+1” jest bezpłatna?
Tak — pełny tekst „Rozpoznawanie problemu N+1” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Django Academy, przejdź na CoddyKit PRO. Kurs Django Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rozpoznawanie problemu N+1”?
Rozpoznawanie klasycznej pułapki zapytania dla każdego wiersza Ćwiczysz Django Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Django Academy?
Nie wymagamy żadnego doświadczenia. Django Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Rozpoznawanie problemu N+1”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Django Academy?
Tak. Każda lekcja Django Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Rozpoznawanie problemu N+1
- select_related dla kluczy obcych
- prefetch_related dla M2M
- Profilowanie za pomocą Debug Toolbar