Курс

Реляционные базы данных и SQL

Как реляционная база хранит, защищает и быстро отдаёт данные — на примере PostgreSQL. Курс разбирает реляционную модель и нормализацию, транзакции и уровни изоляции, устройство индексов и решения планировщика, блокировки, MVCC и VACUUM, масштабирование чтения, а также диагностику медленных запросов: чтение плана выполнения, проблему N+1 и работу индексов под нагрузкой. Цель — находить и устранять самый частый источник проблем производительности в бэкенде, а не бороться с симптомами.

2модуля12уроков

Программа

Что внутри курса

  1. 01

    SQL и реляционные данные

    8 уроков

    Как реляционная база хранит и защищает данные: реляционная модель и нормализация, транзакции и уровни изоляции, устройство индексов и решения планировщика, блокировки, MVCC и VACUUM, а также масштабирование чтения. Примеры на PostgreSQL.

    1. Реляционная модель и нормальные формыДублирование данных в таблице порождает аномалии вставки, обновления и удаления, и нормальные формы убирают их через функциональные зависимости. Урок разбирает реляционную модель, путь от 1NF к 3NF и денормализацию как осознанный компромисс ради скорости чтения.
    2. Транзакции и уровни изоляции: аномалии и MVCC в PostgreSQLУровень изоляции определяет, какие аномалии конкурентного доступа возможны, а PostgreSQL реализует изоляцию через MVCC — каждый запрос видит снимок данных, и читатели не блокируют писателей. Урок разбирает четыре аномалии, дефолтный Read Committed и почему высокая изоляция означает ретраи транзакций.
    3. Индексы и B-Tree: как устроен поиск по индексуБез индекса база сканирует всю таблицу построчно, а индекс — отдельное упорядоченное B-Tree с указателями в heap, по которому поиск спускается за несколько уровней. Урок разбирает устройство дерева, почему оно обслуживает диапазоны и сортировку, и какой ценой на запись оплачивается каждый индекс.
    4. Когда планировщик использует индекс, а когда игнорируетPostgreSQL — стоимостной планировщик: он оценивает селективность условия по статистике и выбирает дешёвый план, поэтому при низкой селективности осознанно предпочитает sequential scan индексу. Урок объясняет, почему «индекс есть, но не используется» — обычно не баг, и как устаревшая статистика ломает планы.
    5. Составные, покрывающие и частичные индексыСоставной индекс работает по левому префиксу, поэтому порядок столбцов важен; покрывающий индекс с INCLUDE отвечает из индекса без обращения в таблицу; частичный индексирует только нужное подмножество строк. Урок разбирает три способа заточить индекс под форму запроса и ограничения каждого.
    6. Блокировки и взаимоблокировкиБезопасный read-modify-write требует явной блокировки строки через SELECT FOR UPDATE, которая блокирует писателей, но не читателей. Урок объясняет, как теряется обновление без блокировки, почему встречный порядок блокировок порождает deadlock и как единый порядок взятия блокировок его предотвращает.
    7. MVCC, VACUUM и распухание таблицPostgreSQL не удаляет старые версии строк сразу — после UPDATE/DELETE они остаются мёртвыми кортежами, пока их видит снимок конкурентной транзакции, и их накопление даёт распухание таблицы. Урок объясняет, почему обычный VACUUM переиспользует место внутри таблицы, а не отдаёт его ОС, и чем от него отличается VACUUM FULL.
    8. Масштабирование чтения: реплики и пул подключенийРеплики чтения уносят нагрузку чтения с primary, но по асинхронной репликации отдают слегка устаревшие данные; пул подключений решает другую проблему — в PostgreSQL каждое соединение это отдельный процесс с памятью. Урок разводит два инструмента под две разные проблемы: пропускную способность чтения и стоимость соединений.
  2. 02

    Производительность запросов

    4 урока

    Как найти, где запрос дорогой, и устранить причину, а не симптом: чтение плана выполнения, проблема N+1 и пакетная выборка, индексы под нагрузку и селективность, диагностика медленного запроса от симптома к гипотезе. Примеры на PostgreSQL.

    1. Чтение плана выполнения: EXPLAIN и EXPLAIN ANALYZEEXPLAIN показывает план как дерево узлов с оценкой стоимости в условных единицах — не в миллисекундах, а EXPLAIN ANALYZE реально выполняет запрос и добавляет фактическое время и число строк. Урок учит читать план снизу вверх и видеть в расхождении оценки и факта по строкам сигнал об устаревшей статистике.
    2. Проблема N+1 и пакетная выборкаПаттерн «список из N строк плюс запрос за связью каждой строки» порождает 1+N запросов, и тормозит он не из-за тяжести запросов, а из-за числа сетевых round-trip'ов. Урок учит распознавать N+1 по логу и сворачивать его в константное число запросов через JOIN или WHERE id IN (…).
    3. Индексы под нагрузку: селективность и когда индекс не помогаетНаличие индекса не гарантирует его использование: он помогает только при селективном условии и подходящей форме — функция над колонкой (lower(col)) и не-якорный LIKE '%x' уводят запрос мимо индекса в Seq Scan. Урок учит по плану понимать, почему индекс «есть, но не помог», и чинить это индексом по выражению.
    4. Диагностика медленного запроса: от симптома к причинеДиагностика — это маршрут от данных к причине, а не индексы наугад: найти реально дорогой запрос по pg_stat_statements (суммарное время = среднее × число вызовов), снять план EXPLAIN ANALYZE, опознать причину по знакомым паттернам и точечно исправить с перепроверкой. Синтез всего модуля.

Готовьтесь по структуре, а не вслепую

Откройте курс в приложении и закрепляйте темы в тренажёре вопросов с AI-разбором.

Реляционные базы данных и SQL: подготовка к собеседованию — JobJump