Введение
Медленные запросы, неудачные индексы, миграции с простоем — эти проблемы знакомы каждому, кто работает с базами данных. Часто не хватает времени или экспертизы, чтобы вникнуть в EXPLAIN или переписать сложный JOIN. Но что, если использовать AI как ассистента? В этой подборке — 12 промтов для PostgreSQL и MongoDB, которые помогают решать типовые задачи производительности без привлечения отдельного DBA. Каждый промт проверен на реальных кейсах и сопровождается примером запроса, ожидаемым результатом и пояснением.
1. Генерация EXPLAIN ANALYZE для PostgreSQL
Задача: быстро получить план выполнения запроса и понять, где узкое место.
Промт:
Ты — эксперт по PostgreSQL. Проанализируй следующий SQL-запрос и сгенерируй для него команду EXPLAIN (ANALYZE, BUFFERS). Объясни, что означает каждый узел плана и на что обратить внимание.
Запрос:
SELECT o.id, o.total, c.name
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at >= '2026-01-01'
ORDER BY o.total DESC
LIMIT 100;
Пример результата:
AI выдаст команду:
EXPLAIN (ANALYZE, BUFFERS)
SELECT o.id, o.total, c.name
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at >= '2026-01-01'
ORDER BY o.total DESC
LIMIT 100;
И пояснит: «Узел Seq Scan на orders указывает на отсутствие индекса по created_at. Рекомендуется создать индекс...».
Пояснение: подходит для быстрой диагностики без ручного анализа плана.
2. Подбор индексов для PostgreSQL
Задача: определить, какие индексы улучшат производительность.
Промт:
Ты — DBA. Проанализируй запрос и предложи оптимальные индексы. Учти селективность, порядок столбцов и тип индекса (B-tree, GIN, BRIN). Объясни, почему каждый индекс поможет.
Запрос:
SELECT * FROM products WHERE category_id = 5 AND price > 1000 ORDER BY created_at DESC;
Пример результата:
AI предложит:
CREATE INDEX idx_products_category_price_created ON products (category_id, price, created_at DESC);
И пояснит: «Составной индекс покрывает условия фильтрации и сортировку, что позволит избежать сортировки в памяти».
Пояснение: помогает не создавать лишние индексы и ускорить конкретные запросы.
3. Переписывание медленных JOIN
Задача: оптимизировать сложный запрос с множеством JOIN.
Промт:
Ты — эксперт по оптимизации SQL. Перепиши запрос, чтобы уменьшить количество JOIN или использовать более эффективные конструкции (например, EXISTS вместо IN, или CTE). Объясни изменения.
Запрос:
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
LEFT JOIN order_items oi ON oi.order_id = o.id
WHERE o.created_at >= '2026-01-01'
GROUP BY c.name;
Пример результата:
AI может предложить:
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id AND o.created_at >= '2026-01-01'
GROUP BY c.name;
Или использовать подзапрос. Пояснение: «Перенос условия в ON уменьшает количество строк до группировки».
Пояснение: подходит для запросов с большим количеством соединений.
4. Проектирование схемы для PostgreSQL
Задача: создать оптимальную схему с учётом нормализации и производительности.
Промт:
Ты — архитектор БД. Спроектируй схему для интернет-магазина: пользователи, товары, заказы, категории. Учти требования: частые выборки по категориям и датам, поддержка транзакций. Предложи DDL и объясни выбор типов и индексов.
Пример результата:
AI сгенерирует таблицы с типами (SERIAL, TIMESTAMPTZ, JSONB для метаданных) и индексами. Например:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(id),
total NUMERIC(10,2),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at DESC);
Пояснение: ускоряет старт проекта и избегает типичных ошибок.
5. Миграции без даунтайма в PostgreSQL
Задача: добавить столбец или изменить тип без блокировки таблицы.
Промт:
Ты — эксперт по миграциям. Предложи безопасный способ добавить столбец email в таблицу users (10 млн строк) без блокировки. Учти PostgreSQL 14+. Напиши шаги и SQL.
Пример результата:
AI предложит:
ALTER TABLE users ADD COLUMN email TEXT;
-- затем заполнение батчами
UPDATE users SET email = ... WHERE ...;
Использовать ALTER TABLE ... ADD COLUMN ... DEFAULT NULL без перезаписи. Для изменения типа — создание новой колонки и переливка данных.
Пояснение: позволяет избежать простоя при миграциях.
6. Агрегации MongoDB
Задача: построить сложный агрегационный пайплайн.
Промт:
Ты — эксперт по MongoDB. Напиши агрегацию для коллекции orders: сгруппируй по customer_id, посчитай сумму заказов за последний месяц, отфильтруй тех, у кого сумма > 1000, отсортируй по убыванию. Объясни этапы.
Пример результата:
AI сгенерирует:
db.orders.aggregate([
{ $match: { created_at: { $gte: new Date(Date.now() - 30*24*60*60*1000) } } },
{ $group: { _id: "$customer_id", total: { $sum: "$amount" } } },
{ $match: { total: { $gt: 1000 } } },
{ $sort: { total: -1 } }
])
Пояснение: ускоряет написание аналитических запросов.
7. Индексы в MongoDB
Задача: выбрать правильный индекс для запроса.
Промт:
Ты — DBA MongoDB. Проанализируй запрос и предложи индекс. Учти порядок полей, направление сортировки и покрывающие индексы.
Запрос:
db.products.find({ category: "electronics", price: { $lt: 500 } }).sort({ rating: -1 })
Пример результата:
AI предложит:
db.products.createIndex({ category: 1, price: 1, rating: -1 })
И пояснит: «Индекс покрывает фильтр и сортировку, что ускорит выполнение».
Пояснение: помогает избежать коллекскейнов.
8. Репликация и шардирование
Задача: настроить отказоустойчивость и масштабирование.
Промт:
Ты — эксперт по распределённым БД. Объясни, как настроить репликацию в PostgreSQL и шардирование в MongoDB для высоконагруженного проекта. Какие подводные камни?
Пример результата:
AI опишет шаги: для PostgreSQL — streaming replication, для MongoDB — sharding с выбором ключа. Укажет на необходимость мониторинга лага и балансировки.
Пояснение: даёт понимание основ без глубокого погружения.
9. Защита от N+1 в ORM
Задача: обнаружить и исправить проблему N+1.
Промт:
Ты — эксперт по ORM. Проанализируй код на Python (SQLAlchemy) и найди проблему N+1. Предложи решение с жадной загрузкой.
Код:
users = session.query(User).all()
for user in users:
print(user.orders)
Пример результата:
AI предложит использовать joinedload или selectinload:
users = session.query(User).options(selectinload(User.orders)).all()
Пояснение: устраняет лишние запросы.
10. Бэкапы и восстановление
Задача: настроить регулярные бэкапы и проверить восстановление.
Промт:
Ты — администратор БД. Составь план бэкапов для PostgreSQL и MongoDB: частоту, инструменты, проверку целостности. Как автоматизировать?
Пример результата:
AI порекомендует pg_dump, pg_basebackup, mongodump, указав на необходимость тестирования восстановления.
Пояснение: помогает избежать потери данных.
11. Мониторинг производительности
Задача: выявить медленные запросы.
Промт:
Ты — эксперт по мониторингу. Какие метрики и инструменты использовать для PostgreSQL и MongoDB? Как настроить сбор медленных запросов?
Пример результата:
AI перечислит pg_stat_statements, mongostat, объяснит, как включить логирование медленных запросов.
Пояснение: позволяет proactively реагировать на проблемы.
12. Миграция с MongoDB на PostgreSQL
Задача: перенести данные без потерь.
Промт:
Ты — эксперт по миграциям. Опиши процесс миграции коллекции MongoDB в таблицу PostgreSQL. Учти преобразование типов и индексы.
Пример результата:
AI предложит использовать ETL-инструменты или скрипты на Python, покажет пример маппинга BSON в JSONB.
Пояснение: упрощает переход между СУБД.
Заключение
Эти 12 промтов покрывают ключевые задачи разработчика и аналитика при работе с PostgreSQL и MongoDB. Они не заменят глубоких знаний, но помогут быстро получить экспертный совет и сэкономить время. Попробуйте применить их в своём проекте — начните с EXPLAIN ANALYZE и подбора индексов. А если хотите системно прокачать навыки работы с БД, обратите внимание на наши курсы по базам данных.
Комментарии