Представьте: ваш проект на Payload CMS с MongoDB, но через месяц LCP превышает 4 секунды. Причина — отсутствие индексов на дату создания. Типичная ситуация: разработчик не настроил составные индексы, и каждый запрос списка постов сканирует всю коллекцию. Или наоборот — PostgreSQL без индексов на datetime превращает пагинацию в тормоза. На одном проекте отсутствие индексов на createdAt привело к росту LCP с 1.2 до 4.1 секунды — падение производительности на 240%. После настройки составных индексов TTFB снизился до 200 мс. Наш опыт — 5+ лет работы с Payload CMS, десятки проектов от блогов до enterprise-порталов. Мы настраиваем базу так, чтобы она не требовала доработок полгода, а нагрузка до 10 000 RPM не вызывала паники.
Почему выбор адаптера БД критичен для Payload CMS?
Payload CMS поддерживает два адаптера: PostgreSQL через Drizzle ORM и MongoDB через Mongoose. Каждый имеет свои сильные стороны, но неправильный выбор приводит к проблемам: N+1 запросы, медленные миграции, падение TTFB.
Ошибки типизации и N+1 запросы — интеграция payload cms
Payload часто генерирует много запросов при вложенных связях. Например, список постов с авторами и тегами: без eager-loading каждый пост вызывает отдельный select. В PostgreSQL мы решаем это через Drizzle findMany с deep отношением и select — один запрос вместо N+1. В MongoDB — агрегация $lookup с индексами.
Провал миграции на production
Пуш схемы через Drizzle в production может сбросить данные или удалить колонки. Мы всегда отключаем push: false и создаём миграции с ревью. В одном проекте клиент внёс поле без чек-листа — миграция удалила таблицу версий (_posts_v). Восстановили из бэкапа за 1 час. Нагрузочное тестирование выявило, что 60% проблем с TTFB связаны с отсутствием индексов.
Отсутствие индексов — медленный поиск
По умолчанию Payload не создаёт индексы на все поля. Результат: TTFB часто 2-3 секунды при фильтрации по статусу и категории. Мы добавляем составные индексы на часто запрашиваемые комбинации — это снижает время запроса на 80%.
Как настроить миграции для PostgreSQL и MongoDB в Payload?
Миграции — ключевой элемент production-настройки. Для PostgreSQL используем Drizzle ORM с отключённым push. Команды:
npx payload migrate:create # Сгенерировать npx payload migrate # Применить npx payload migrate:down # Откатить npx payload migrate:status # Проверить статус Для MongoDB миграции не нужны — Mongoose синхронизирует схему на лету. Но в production рекомендуется контроль изменений через скрипты. В 80% случаев проблема решается доработкой индексов. Экономия времени разработки — до 40%.
Как оптимизировать запросы в Payload CMS?
Мы используем три метода. Во-первых, добавляем индексы на все поля фильтрации и сортировки. Для PostgreSQL — составные индексы (например, на status + createdAt), для MongoDB — db.collection.createIndex(). Во-вторых, настраиваем пул соединений: max: 10 для большинства проектов, с PgBouncer для высоких нагрузок. В-третьих, для сложных отчётов делаем прямые запросы через Drizzle ORM — это быстрее, чем REST API.
Результаты оптимизации на примере:
| Тип запроса | До оптимизации | После оптимизации |
|---|---|---|
| Список постов с авторами | 450 ms | 45 ms |
| Поиск по категориям | 300 ms | 60 ms |
Пример прямого запроса через Drizzle
const db = payload.db.drizzle const result = await db .select({ id: posts.id, title: posts.title }) .from(posts) .where(eq(posts.status, 'published')) .orderBy(sql`created_at DESC`) .limit(10) Какие преимущества даёт правильная настройка индексов?
Правильные индексы — основа производительности. TTFB снижается до 200 мс, LCP — до 1.5 секунд. На одном проекте после добавления составных индексов на status и category количество запросов к базе сократилось в 10 раз. Это особенно важно для сайтов с высокой посещаемостью.
Сравнение адаптеров: PostgreSQL vs MongoDB
| Критерий | PostgreSQL | MongoDB |
|---|---|---|
| Строгость схемы | Высокая (миграции обязательны) | Гибкая (схема создаётся на лету) |
| Сложные связи | JOIN — эффективно до 5 таблиц | $lookup — медленно без индексов |
| Версионирование | Отдельные таблицы _v (большой объём) |
Вложенные версии (компактно) |
| Production-рекомендация | Структурированные данные с чёткими связями | Прототипы, контент с частыми изменениями |
PostgreSQL лучше MongoDB для строгих схем в 2-3 раза по скорости связных запросов (наш тест: 10 таблиц, 100k записей, JOIN vs $lookup). Но если вам нужна гибкость полей — MongoDB выигрывает в простоте.
Что вы получаете в результате настройки
| Этап | Результат |
|---|---|
| Аудит текущей схемы | Отчёт о индексах, N+1 запросах и конфигурации пула |
| Настройка адаптера | Конфиг payload.config.ts с оптимизациями |
| Создание миграций | Скрипты миграций с ревью |
| Нагрузочное тестирование | Протокол тестов Artillery |
| Документация | README и инструкция по эксплуатации |
| Гарантия | 30 дней поддержки после запуска |
Процесс работы
- Аналитика: изучаем структуру данных, нагрузку, требования к локализации и версиям.
- Проектирование: выбираем адаптер, проектируем индексы, настраиваем пул соединений.
- Реализация: конфигурация Payload, создание миграций, интеграция с внешними БД (если нужно).
- Тестирование: нагрузочное тестирование (Artillery), проверка LCP/INP, отладка медленных запросов.
- Деплой: настройка SSL, PgBouncer для PostgreSQL, Atlas для MongoDB, мониторинг через Grafana.
Мы гарантируем стабильность работы базы данных и предоставляем поддержку в течение 30 дней после запуска. Свяжитесь с нами для консультации по вашему проекту. Мы оценим текущую архитектуру и предложим оптимальные решения. Закажите настройку Payload CMS под ключ — и забудьте о проблемах с базами данных.
Для глубокого понимания адаптеров изучите официальную документацию: PostgreSQL и MongoDB.
Согласно документации Payload CMS, для production рекомендуется использовать PostgreSQL с Drizzle ORM.







