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;
ℹ️
Миграции применяются по порядку и не редактируются после мерджа — новые изменения добавляют новым файлом. Так база в проде и на проде совпадает дословно.