Промты, которые заменят вам DBA: управляем PostgreSQL, MongoDB и Redis через диалог с ИИ
Представьте: вы — бэкенд-разработчик в небольшой команде, где нет выделенного администратора баз данных. Вы отвечаете за схему, запросы, индексы и кеш. Ошибка в индексе — и продакшн тормозит. Неверный запрос — и база падает под нагрузкой. Раньше в таких случаях звали DBA или штудировали документацию часами. Сегодня можно просто спросить ИИ — если знать, как правильно формулировать промты.
Эта подборка — не про «магические кнопки». Это конкретные, проверенные формулировки для ChatGPT, Claude или другого ассистента, которые помогают проектировать схемы, ускорять запросы, настраивать индексы и управлять кешем. Каждый промт сопровождается примером входа и выхода, а также пояснением, для какой задачи он подходит. Все примеры синтаксиса соответствуют официальной документации PostgreSQL, MongoDB и Redis.
1. Аудит схемы PostgreSQL: находим узкие места до того, как они выстрелят
Задача: проверить существующую схему на предмет отсутствия индексов, избыточных связей и потенциальных блокировок.
Промт:
Ты — опытный DBA PostgreSQL. Проанализируй следующую схему таблиц (DDL). Найди: 1) столбцы, по которым часто фильтруют, но нет индексов; 2) внешние ключи без индексов; 3) потенциальные проблемы с блокировками при конкурентных транзакциях. Предложи конкретные CREATE INDEX и объясни, почему каждый нужен. Схема: ...
Пример входа:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
status TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE order_items (
order_id INT REFERENCES orders(id),
product_id INT,
quantity INT
);
Пример выхода (сокращённо):
-- Индекс на user_id для быстрого поиска заказов пользователя
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Индекс на status для фильтрации по статусу
CREATE INDEX idx_orders_status ON orders(status);
-- Индекс на order_id для JOIN с order_items
CREATE INDEX idx_order_items_order_id ON order_items(order_id);
Пояснение: Промт заставляет ИИ мыслить как DBA и выдавать готовые SQL-команды. Подходит для ревью схемы перед деплоем.
2. Оптимизация медленного запроса: превращаем 5 секунд в 50 мс
Задача: ускорить конкретный SELECT, который выполняется слишком долго.
Промт:
У меня есть медленный запрос в PostgreSQL. Вот он: [текст запроса]. Вот план выполнения (EXPLAIN ANALYZE): [вставить план]. Предложи, как переписать запрос или какие индексы добавить, чтобы уложиться в 100 мс. Объясни, почему текущий план плох.
Пример входа:
SELECT u.name, COUNT(o.id)
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.created_at > '2026-01-01'
GROUP BY u.name;
Пример выхода:
-- Добавить индекс на orders.created_at
CREATE INDEX idx_orders_created_at ON orders(created_at);
-- Переписать запрос с использованием подзапроса
SELECT u.name, o.cnt
FROM users u
JOIN (
SELECT user_id, COUNT(*) AS cnt
FROM orders
WHERE created_at > '2026-01-01'
GROUP BY user_id
) o ON u.id = o.user_id;
Пояснение: ИИ анализирует план и предлагает конкретные шаги. Экономит часы ручного анализа.
3. Генерация индексов для JSONB в PostgreSQL
Задача: создать индексы для полей внутри JSONB-колонки.
Промт:
В PostgreSQL есть таблица events с колонкой data типа JSONB. Внутри data часто ищут по ключу 'user_id' (число) и 'event_type' (строка). Предложи оптимальные индексы (GIN, BTREE) и примеры запросов, которые они ускорят.
Пример выхода:
-- Индекс для поиска по user_id
CREATE INDEX idx_events_user_id ON events ((data->>'user_id'));
-- Индекс для event_type
CREATE INDEX idx_events_event_type ON events ((data->>'event_type'));
-- Для сложных запросов можно использовать GIN
CREATE INDEX idx_events_data_gin ON events USING GIN (data);
Пояснение: JSONB — мощный инструмент, но без индексов запросы к нему медленные. Промт помогает выбрать правильный тип индекса.
4. Проектирование схемы MongoDB: когда embedded, а когда references
Задача: выбрать между встраиванием документов и ссылками.
Промт:
Проектирую MongoDB для блога. Есть сущности: пользователи, посты, комментарии. Посты могут содержать до 100 комментариев. Что лучше: встраивать комментарии в пост или хранить отдельной коллекцией? Объясни плюсы и минусы, предложи схему документов.
Пример выхода:
// Вариант с встраиванием (если комментариев немного и они всегда нужны вместе с постом)
{
_id: ObjectId,
title: "...",
comments: [
{ user_id: ObjectId, text: "...", created_at: ISODate }
]
}
// Вариант со ссылками (если комментариев много или нужна пагинация)
// Коллекция posts
{ _id: ObjectId, title: "..." }
// Коллекция comments
{ _id: ObjectId, post_id: ObjectId, user_id: ObjectId, text: "..." }
Пояснение: Промт помогает принять архитектурное решение на основе лучших практик MongoDB.
5. Агрегация в MongoDB: составляем pipeline для отчёта
Задача: написать сложный агрегационный запрос.
Промт:
Напиши aggregation pipeline для MongoDB. Коллекция sales: { date, product_id, quantity, price }. Нужно: сгруппировать по product_id, посчитать общую выручку (quantity * price), отфильтровать продукты с выручкой > 10000, отсортировать по убыванию выручки. Выведи product_id и revenue.
Пример выхода:
db.sales.aggregate([
{ $group: {
_id: "$product_id",
revenue: { $sum: { $multiply: ["$quantity", "$price"] } }
}},
{ $match: { revenue: { $gt: 10000 } } },
{ $sort: { revenue: -1 } },
{ $project: { _id: 0, product_id: "$_id", revenue: 1 } }
])
Пояснение: ИИ генерирует готовый pipeline, который можно сразу выполнить в mongosh.
6. Настройка TTL-индексов в MongoDB для автоочистки
Задача: автоматически удалять старые документы.
Промт:
В коллекции logs MongoDB есть поле created_at типа Date. Нужно, чтобы документы старше 30 дней автоматически удалялись. Как создать TTL-индекс? Приведи команду и объясни, как проверить его работу.
Пример выхода:
db.logs.createIndex({ "created_at": 1 }, { expireAfterSeconds: 2592000 }) // 30 дней
// Проверка:
db.logs.getIndexes()
Пояснение: TTL-индексы — простой способ управлять жизненным циклом данных без внешних скриптов.
7. Кеширование в Redis: выбираем структуру данных
Задача: определить, какую структуру Redis использовать для конкретного сценария.
Промт:
Мне нужно кешировать результаты поиска по товарам. Ключ — поисковый запрос, значение — список ID товаров. TTL — 1 час. Какую структуру Redis выбрать: String, List, Set, Hash? Объясни и приведи примеры команд.
Пример выхода:
# Использовать String с JSON-сериализацией
SET search:iphone "[1,2,3]" EX 3600
GET search:iphone
Пояснение: Промт помогает выбрать оптимальный тип и избежать ошибок с сериализацией.
8. Инвалидация кеша в Redis: паттерны и антипаттерны
Задача: организовать сброс кеша при обновлении данных.
Промт:
У меня есть кеш в Redis для профилей пользователей (ключи вида user:123:profile). При обновлении профиля нужно сбросить кеш. Предложи стратегии инвалидации: по ключу, по тегам, с использованием Pub/Sub. Какие подводные камни?
Пример выхода:
# Инвалидация по ключу
DEL user:123:profile
# Инвалидация по шаблону (осторожно, блокирует Redis)
SCAN 0 MATCH user:123:* COUNT 100
Пояснение: Промт предупреждает о проблемах с производительностью и предлагает безопасные подходы.
9. Мониторинг производительности PostgreSQL: какие метрики смотреть
Задача: настроить базовый мониторинг без DBA.
Промт:
Я разработчик, хочу следить за здоровьем PostgreSQL. Какие 5 метрик самые важные? Как их получить через SQL? Напиши запросы к системным представлениям pg_stat_activity, pg_stat_user_tables и pg_stat_statements.
Пример выхода:
-- Долгие запросы
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '5 seconds';
-- Блокировки
SELECT * FROM pg_locks WHERE NOT granted;
Пояснение: Простые запросы, которые можно запускать регулярно и вовремя замечать проблемы.
10. Миграция данных из MongoDB в PostgreSQL: генерируем скрипт
Задача: перенести данные между разными СУБД.
Промт:
Нужно перенести данные из коллекции MongoDB users в таблицу PostgreSQL users. Поля: _id (ObjectId), name, email, created_at (ISODate). Напиши Python-скрипт с использованием pymongo и psycopg2, который выгружает данные и вставляет их в PostgreSQL. Учти преобразование типов.
Пример выхода (сокращённо):
from pymongo import MongoClient
import psycopg2
mongo = MongoClient('mongodb://localhost:27017')
pg = psycopg2.connect('dbname=test user=postgres')
for doc in mongo.db.users.find():
cur = pg.cursor()
cur.execute(
"INSERT INTO users (id, name, email, created_at) VALUES (%s, %s, %s, %s)",
(str(doc['_id']), doc['name'], doc['email'], doc['created_at'])
)
pg.commit()
Пояснение: Промт экономит время на написание рутинного кода миграции.
11. Безопасность: проверяем права доступа в PostgreSQL
Задача: убедиться, что у пользователя нет лишних привилегий.
Промт:
Проверь права пользователя app_user в PostgreSQL. Какие запросы покажут его привилегии на таблицы, схемы и базы данных? Напиши SQL для проверки и объясни, как отозвать лишние права.
Пример выхода:
-- Права на таблицы
SELECT grantee, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'app_user';
-- Отзыв прав
REVOKE DELETE ON ALL TABLES IN SCHEMA public FROM app_user;
Пояснение: Регулярная проверка прав — часть гигиены безопасности. Промт даёт готовые запросы.
12. Резервное копирование и восстановление: инструкции для трёх СУБД
Задача: быстро получить команды для бэкапа и восстановления.
Промт:
Напиши команды для резервного копирования и восстановления для PostgreSQL, MongoDB и Redis. Для каждой СУБД: команда бэкапа, команда восстановления, важные флаги. Предположи, что нужно сохранить дамп в файл.
Пример выхода:
# PostgreSQL
pg_dump -U user -d dbname -f backup.sql
psql -U user -d dbname -f backup.sql
# MongoDB
mongodump --db dbname --out /backup/
mongorestore --db dbname /backup/dbname
# Redis
redis-cli SAVE # создаёт dump.rdb
# Восстановление: скопировать dump.rdb в директорию и перезапустить Redis
Пояснение: Шпаргалка на случай, когда нужно срочно сделать бэкап, а под рукой нет админа.
Эти двенадцать промтов покрывают основные задачи, с которыми сталкивается разработчик без выделенного DBA: от проектирования схемы до восстановления из бэкапа. Используйте их как отправную точку, адаптируйте под свой контекст и всегда проверяйте сгенерированный код на тестовой среде. ИИ не заменяет экспертизу, но может стать вашим персональным ассистентом, который ускоряет рутину и подсказывает лучшие практики. Попробуйте применить хотя бы один промт в своём проекте — и вы удивитесь, сколько времени освободится для действительно важных задач.
Источники:
- Официальная документация PostgreSQL: https://www.postgresql.org/docs/current/
- Документация MongoDB: https://www.mongodb.com/docs/manual/
- Документация Redis: https://redis.io/docs/
Комментарии