Базы · Урок 56

PostgreSQL: индексы и миграции

База из урока 22 работала на небольших данных. Теперь делаем её «взрослой»: индексы для скорости, транзакции для целостности и миграции для эволюции схемы.

Индексы

CREATE INDEX idx_posts_user ON posts (user_id);

-- без индекса: последовательный просмотр всей таблицы
-- с индексом: поиск по дереву за доли секунды

EXPLAIN SELECT * FROM posts WHERE user_id = 7;
-- проверяйте  план перед «ускорением»: иногда индексация не нужна
💡
Индекс ускоряет чтение, но замедляет запись и занимает место. Индексируйте колонки, по которым реально ищут и сортируют в WHERE/ORDER BY, а не «на всякий случай».

Транзакции

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;   -- или ROLLBACK при ошибке — деньги не «потеряются» между шагами

Миграции

Схема меняется вместе с кодом — поэтому версионируем её файлами миграций (например, через node-pg-migrate или Prisma):

-- 001-init-posts.sql
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  user_id INT REFERENCES users(id)
);

-- 002-add-published.sql
ALTER TABLE posts ADD COLUMN published BOOLEAN DEFAULT FALSE;
ℹ️
Миграции применяются по порядку и не редактируются после мерджа — новые изменения добавляют новым файлом. Так база в проде и на проде совпадает дословно.