Базы данных

Разберись, как СУБД превращает SQL в план, хранит версии строк и защищает транзакции от гонок. Научись читать план запроса, выбирать индексы и работать с пулом соединений из Go, а затем оценивать варианты репликации и масштабирования по их цене.

  1. 6.1 Общая теория и SQL

    Свяжи реляционную модель с тем, что увидишь в запросе: как NULL меняет логику условий, почему JOIN может размножить строки и как физический план влияет на скорость. Это поможет выбирать хранилище по запросам и проверять результат через план, а не по виду SQL.

  2. 6.2 Транзакции, ACID, уровни изоляции

    Посмотри на транзакцию как на способ сохранить бизнес-инвариант при параллельной работе запросов. Разбери аномалии через порядок операций, сопоставь их с уровнями изоляции PostgreSQL и пойми, зачем приложению обрабатывать конфликты и дедлоки.

  3. 6.3 MVCC и внутренности PostgreSQL

    Свяжи MVCC с повседневным поведением PostgreSQL: обновление создаёт новую версию строки, а старая остаётся видимой уже начатым снимкам. Из этого следуют работа autovacuum, влияние долгих транзакций и причины разрастания таблиц и индексов.

  4. 6.4 Индексы

    Научись оценивать индекс как отдельную структуру с ценой чтения, записи и хранения. Разбери B-tree, составные и покрывающие индексы и ситуации, когда планировщик выбирает последовательное чтение, хотя индекс существует.

  5. 6.5 Оптимизация запросов

    Разбирай медленный запрос по фактическому плану: сравнивай оценки строк с реальностью, ищи лишние чтения и только потом меняй SQL или индекс. Эта глава также показывает, как распознать N+1, дорогой OFFSET и неудачную пакетную загрузку в Go-коде.

  6. 6.6 Практические SQL-задачи

    Отработай повторяющиеся формы SQL на задачах: антиджойн, дедупликацию, ранжирование внутри группы и рекурсивный обход дерева. Сравнивай решение не только по синтаксису, но и по точной семантике: что считается дублем, как обрабатываются равные значения и как остановить цикл.

  7. 6.7 Работа с БД из Go

    Пройди путь запроса от пула до строки результата: соединения ограничены, контекст должен дойти до драйвера, а rows нужно закрыть и проверить после итерации. Научись удерживать транзакцию в одном владельце, параметризовать значения и выкатывать изменение схемы без конфликта со старой версией…

  8. 6.8 Масштабирование и отказоустойчивость БД

    Раздели масштабирование чтения, отказоустойчивость и распределение данных: реплики не решают все три задачи одинаково. Сравни синхронную репликацию, лаг чтения, failover, шардирование и бэкапы, а также разберись, почему распределённая транзакция часто уступает саге с явными промежуточными…