Индексы и план запросов
Тема дорожной карты · Backend разработчик
Индексы баз данных — структуры данных, поддерживаемые совместно с данными таблицы, позволяющие движку базы данных находить строки, удовлетворяющие условию запроса, за логарифмическое время вместо полного последовательного сканирования миллионов строк. PostgreSQL и MySQL оба поддерживают B-tree индексы (по умолчанию, покрывают запросы равенства и диапазона), Hash-индексы (только равенство, быстрее для точного поиска), GIN-индексы (полнотекстовый поиск и JSONB containment в PostgreSQL) и частичные индексы (CREATE INDEX idx_active_users ON users(email) WHERE active = true), индексирующие только отфильтрованное подмножество строк. Создание индекса несложно — CREATE INDEX idx_orders_user_id ON orders(user_id); — но каждый индекс добавляет накладные расходы на запись при INSERT, UPDATE и DELETE и занимает дисковое пространство, поэтому каждый индекс должен быть обоснован паттернами запросов, выявленными через EXPLAIN ANALYZE (PostgreSQL) или EXPLAIN FORMAT=JSON (MySQL). Составные индексы следуют правилу крайнего левого префикса: индекс по (user_id, created_at) ускоряет запросы WHERE user_id = ? и WHERE user_id = ? AND created_at > ?, но не WHERE created_at > ? в одиночку. Индексы баз данных также критически важны для колонок внешних ключей (PostgreSQL не создаёт их автоматически, в отличие от MySQL), уникальных ограничений (CREATE UNIQUE INDEX) и колонок в предложениях ORDER BY, где сканирование индекса может устранить дорогостоящий шаг сортировки.
Как это работает
Индексы и план запросов используют ACID-транзакции, декларативный SQL, реляционную схему. PostgreSQL — современный дефолт для новых проектов (богатая типизация, JSON-поддержка, расширения, MVCC); MySQL/MariaDB всё ещё распространён (legacy + WordPress); SQLite — для маленьких single-host (удивительно мощный); CockroachDB / YugabyteDB — для распределённого SQL. Стратегия индексов, план запроса (EXPLAIN), connection pooling — операционные основы. Миграции через Alembic, Flyway, Liquibase или фреймворк-специфичные тулы.
Когда применять
Postgres по умолчанию для любого нового проекта — широкий feature set, зрелая эксплуатация, JSON и full-text встроены. MySQL — только если команда или хостинг уже на нём. SQLite — для embedded или первых 10к юзеров (буквально — масштабируется дальше, чем думают). Distributed SQL (Cockroach, Yugabyte, TiDB) — только когда переросли primary-replica Postgres; эта точка гораздо дальше, чем продают вендоры.
Типичные ошибки
Ловушки Индексы и план запросов: пропущенные индексы на колонках в WHERE / JOIN (один медленный запрос валит БД); N+1 паттерны от ORM (eager-load явно); долгие транзакции держат локи (делите на меньшие записи); не анализируете план запросов перед деплоем (EXPLAIN ANALYZE); pool соединений мал или велик (начните с max_connections / replica_count, тюньте по наблюдениям).