Классическая ловушка при работе с ORM (Django ORM, SQLAlchemy, Hibernate, Sequelize). Это ситуация, когда вместо одного умного запроса к базе данных твой бэкенд делает сотни мелких.
Представь, что нужно вывести 10 постов и имена их авторов.
❌ Как ORM делает по умолчанию (Проблема N+1):
# 1 запрос: получает 10 постов
posts = Post.objects.all()
for post in posts:
# Еще 10 отдельных запросов: по одному на каждого автора!
print(post.title, post.author.name)
1 запрос для постов + 10 для авторов = 11 запросов к базе. А если постов будет 1000?
⚡ Как это чинится
Мы сразу говорим базе вытащить постов вместе с авторами через
JOIN.# Всего 1 ленивый запрос, который сразу соберет все данные
posts = Post.objects.select_related('author').all()
for post in posts:
print(post.title, post.author.name) # Данные уже в памяти, запросов к базе нет!