Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.
Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.
2 496 подписчиков · @database_info
К каналу →
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://m…
Читать далее →
677
Реклама
⚔️ SQL vs NoSQL: Что выбрать для вашего проекта? Выбор базы данных - одно из ключевых архитектурных решений. Нет универсальной "серебряной пули", есть инструменты под разные задач…
Читать далее →
781

Антипаттерн: N+1 запросов — как заметить и починить Вы берёте список сущностей, а потом в цикле для каждой тянете связа

Антипаттерн: N+1 запросов — как заметить и починить

Вы берёте список сущностей, а потом в цикле для каждой тянете связанные данные. В итоге - 1 запрос за «родителями» + N запросов за «детьми». Латентность растёт линейно от размера выборки.

Симптомы

- В логах много одинаковых коротких запросов.
- Кол-во запросов ≈ размеру списка.
- Страница/endpoint сильно «замедляется» при росте данных.

Плохой пример (SQL + псевдокод)

-- Берём пользователей
SELECT id, name FROM users WHERE active = true;

-- Потом в цикле по каждому:
SELECT count(*) FROM orders WHERE user_id = :id;

Правильно (SQL, PostgreSQL) — сетевое мышление:

SELECT u.id,
u.name,
count(o.*) AS orders_cnt
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.active = true
GROUP BY u.id, u.name;

Django ORM

# Плохо: в шаблоне/цикле обращаемся к user.orders -> N+1
users = User.objects.filter(active=True)

# Хорошо: подгрузим связи заранее
users = (User.objects
.filter(active=True)
.prefetch_related('orders')) # для 1:N
# для 1:1 / ForeignKey используйте select_related('profile')

# Агрегация без цикла
from django.db.models import Count
users = (User.objects.filter(active=True)
.annotate(orders_cnt=Count('orders')))

SQLAlchemy

from sqlalchemy.orm import selectinload, joinedload

# 1:N — безопаснее selectinload (батчирует IN (...))
users = (session.query(User)
.options(selectinload(User.orders))
.filter(User.active.is_(True))
.all())

# 1:1 — joinedload
user = (session.query(User)
.options(joinedload(User.profile))
.get(user_id))

Практические советы

- Логируйте кол-во запросов на эндпойнт/страницу. В Django - django-debug-toolbar, assertNumQueries в тестах; в SQLAlchemy - echo/интеграция с логгером.
- Индексы: обязательно orders(user_id); если фильтруете по статусу - составной (user_id, status).
- Батчинг вместо циклов: тяните детей одним запросом WHERE user_id IN (...), затем мапьте в памяти.
- Осторожно с joinedload для 1:N на больших выборках - риск «взрыва» строк. Для 1:N чаще выбирайте selectinload.
- Колонки по делу: не тащите SELECT *, берите только нужные поля.
- Пагинация: уменьшает N и давление на сеть/память.
- EXPLAIN (ANALYZE, BUFFERS) - проверяйте планы и кардинальности.


💡Думайте наборами, а не циклами. Eager loading + агрегаты закрывают 90% случаев N+1. Настройте мониторинг количества запросов - и ловите проблему до продакшена.

Сохрани, чтобы не наступить снова. Поделись с коллегами. А как вы ловите N+1 у себя?

#db

👉 @database_info
🎥 Вебинар: Сделайте модель своей: дообучение LLM методом QLoRA без кода Базовая модель не знает вашего домена. На живом демо дообучим локальную LLM методом QLoRA на одной видеокар…
Читать далее →
741
Типы JOIN в SQL и когда их применять - INNER JOIN - пересечение множеств (только совпавшие строки). - LEFT JOIN - все слева + совпавшие справа (несовпавшие → NULL). - RIGHT JOIN -…
Читать далее →
802
Другие главы канала «Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 24.09.2026
Сегодня я хочу рассказать вам про одну часто недооцененную фишку в PostgreSQL - …
👁 327 просмотров
Глава от 23.09.2026
Автоматизация платформы не отбирает у вас интересные задачи. Она забирает рутину…
👁 446 просмотров
Глава от 23.09.2026
🚀 Сегодня я покажу вам один из моих любимых хаков для PostgreSQL – генерация сер…
👁 473 просмотров
Глава от 22.09.2026
⚡️ Совет по работе с базами данных 💡 Уникальные индексы с исключением определен…
👁 605 просмотров
Глава от 21.09.2026
Как быстро найти “тяжёлые” запросы в PostgreSQL Сегодня покажу простой способ н…
👁 593 просмотров
Глава от 20.09.2026
🚀 Сегодня покажу, как быстро диагностировать «тормоза» в PostgreSQL - без всяких…
👁 604 просмотров
Глава от 17.09.2026
🧩 Как сделать backup PostgreSQL с минимальной нагрузкой на прод? Сегодня покажу…
👁 787 просмотров
Глава от 17.09.2026
ИТ-сообщество, хватит онлайн-митапов – приходите офлайн. 18 сентября в Москве с…
👁 420 просмотров
Глава от 17.09.2026
🎯 Сегодня покажу простой способ ускорить запросы в PostgreSQL, даже не трогая са…
👁 724 просмотров

Популярные посты канала «Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.»

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 6 033 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 5 982 просмотров
Многопользовательская игра, похожая на DOOM, написанная на чистом SQL DOOMQL - это экспериментальный проект, который позволяет играть в DOO…
👁 5 976 просмотров
Типы JOIN в SQL и когда их применять - INNER JOIN - пересечение множеств (только совпавшие строки). - LEFT JOIN - все слева + совпавшие спр…
👁 5 972 просмотров
🔥 Неправильные типы данных в БД — тихий убийца производительности Одна из самых частых ошибок — выбирать тип “на всякий случай побольше”. …
👁 5 946 просмотров
Антипаттерн: N+1 запросов — как заметить и починить Вы берёте список сущностей, а потом в цикле для каждой тянете связанные данные. В итоге…
👁 5 901 просмотров
🚨 Антипаттерн: Почему OFFSET убивает твою базу (и как делать пагинацию правильно) Привет! Если вы когда-нибудь реализовывали каталог товаро…
👁 5 857 просмотров
7 SQL-запросов, которые решают 90% всех задач на работе Каждый день одно и то же. Открываешь клиент базы данных, чтобы что-то проверить, по…
👁 5 823 просмотров
⚔️ SQL vs NoSQL: Что выбрать для вашего проекта? Выбор базы данных - одно из ключевых архитектурных решений. Нет универсальной "серебряной …
👁 5 815 просмотров
Продвинутый курс SQL за час - проще некуда Сегодня я продолжу рассказывать про SQL и мы погрузимся уже в чуть более интересные запросы, свя…
👁 5 789 просмотров
🖥 Основы SQL за час - бесплатно и проще некуда Содержание: 00:00 - подготавливаем базу 04:36 - выбираем данные SELECT 08:30 - указываем тек…
👁 5 752 просмотров
🔥 Индексы в PostgreSQL: когда они реально помогают, а когда мешают Многие ставят индексы “на всё подряд”, а потом удивляются, почему БД тор…
👁 5 713 просмотров
Визуализация SQL-запроса #db 👉 @database_info
👁 5 698 просмотров
🚨 Антипаттерн: хранить пароли в базе "как есть" Да, звучит как очевидный совет, но на практике до сих пор встречаются проекты, где пароль с…
👁 5 661 просмотров
Базы данных классифицируются в первую очередь по методу организации данных, способу их поиска и хранения, производительности при доступе к д…
👁 5 642 просмотров
⚠️ Можно знать алгоритмы машинного обучения и всё равно получать плохие результаты. Большинство проблем моделей начинаются с некачественной …
👁 5 632 просмотров
Немного юмора) #db 👉 @database_info
👁 5 628 просмотров
Антипаттерны JOIN-ов в SQL и как их избежать JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 лову…
👁 5 622 просмотров
5 нормальных форм баз данных, которые должен знать каждый разработчик #db 👉 @database_info
👁 5 596 просмотров
Шардирование базы данных на пальцах Популярные приложения рано или поздно должны масштабироваться для ускорения доступа к данным и увеличен…
👁 5 588 просмотров

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
👥 365 748 · -8 173/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
7924148410
👥 199 487 · +1 239/7д
@biologia89
РОБЛОКС🔷
РОБЛОКС В МАКС! Реклама: https://clck.ru/3Tmmgx
👥 179 445 · -1 751/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Розыгрыши: kichaev@wylsacom.media По вопросам сотрудничества: https://wylsacom.medi…
👥 172 201 · +4 791/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 123 700 · +1 450/7д
@yandex_browser
Яндекс Браузер с Алисой AI
Привет, это канал команды Яндекс Браузера Показываем, как превратить наши технологии в ваши возможности. Скачать Браузер тут: https://browser.yandex.ru/ Наше сообще
👥 78 925 · +280/7д
🏷 Темы и теги
#db #базы данных #big data #оптимизация запросов #архитектура бд #sql #nosql #Технологии
📋 О канале Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.
Всё о проектировании и работе с данными. Глубокий разбор SQL (Join, Index, Query Tuning). Реляционные СУБД: Postgres, Oracle, MS SQL. NoSQL технологии: MongoDB, Redis, Cassandra, ClickHouse. Архитектура высоконагруженных систем: репликация, шардинг, CAP-теорема, ACID транзакции. Оптимизация медленных запросов. Моделирование данных и нормализация. ETL процессы и миграция.
🔍 Архив всех постов Макс
Поиск по 16,996,906 постам из 203,890 каналов
Подключить за 490 ₽/мес →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Базы Данных (Data Base) | SQL & NoSQL. PostgreSQL, MySQL и Big Data. Уроки для Backend и Data Engineer. Архитектура БД, Оптимизация и Design.» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
➕
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

Бесплатная регистрация, быстрая модерация.