Введение
Современный разработчик ежедневно сталкивается с десятками запросов к базам данных — от простых SELECT до сложных агрегаций и миграций. AI-ассистенты (вроде ChatGPT, Claude или GitHub Copilot) могут в разы ускорить эту работу, если правильно формулировать промты. В этой подборке — 10 проверенных промтов для PostgreSQL, MongoDB и Redis, которые я использую в продакшене. Каждый сопровождается реальным примером и кодом.
1. PostgreSQL: оптимизация медленного запроса с EXPLAIN ANALYZE
Промт: «Проанализируй следующий EXPLAIN ANALYZE вывод и предложи индексы или рефакторинг для ускорения запроса. Объясни простыми словами, что является узким местом: [вставь вывод].»
Пример: У вас есть запрос поиска заказов по дате и статусу, который выполняется 12 секунд. AI подскажет создать составной индекс на (status, created_at) или переписать условия.
CREATE INDEX idx_orders_status_date ON orders (status, created_at);
2. PostgreSQL: генерация миграции для изменения схемы
Промт: «Напиши безопасную миграцию на SQL для добавления колонки 'phone' в таблицу 'users' с ограничением уникальности и значением по умолчанию NULL. Учти, что в таблице 2 млн строк, и добавление должно пройти без длительной блокировки.»
Пример: AI сгенерирует миграцию с использованием NOT VALID и последующей валидацией:
ALTER TABLE users ADD COLUMN phone VARCHAR(20) UNIQUE;
-- для больших таблиц используйте:
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
CREATE UNIQUE INDEX CONCURRENTLY idx_users_phone ON users (phone);
3. PostgreSQL: поиск дубликатов и дедупликация
Промт: «Найди дубликаты в таблице 'contacts' по полям email и phone. Выведи только те записи, у которых более одного совпадения, и предложи запрос для удаления старых дубликатов, сохранив одну запись с наибольшим id.»
Пример: Сначала CTE для поиска:
WITH dupes AS (
SELECT email, phone, COUNT(*) cnt
FROM contacts
GROUP BY email, phone
HAVING COUNT(*) > 1
)
SELECT * FROM contacts WHERE (email, phone) IN (SELECT email, phone FROM dupes);
А затем удаление:
DELETE FROM contacts
WHERE id NOT IN (
SELECT MIN(id) FROM contacts GROUP BY email, phone
);
4. MongoDB: проектирование агрегации для отчёта
Промт: «Напиши aggregation pipeline для MongoDB, который по коллекции 'orders' возвращает топ-10 товаров по сумме выручки за последние 7 дней. Включи название товара, общее количество и сумму. Используй $lookup для присоединения коллекции 'products'.»
Пример:
db.orders.aggregate([
{ $match: { createdAt: { $gte: new Date(Date.now() - 7*24*60*60*1000) } } },
{ $group: { _id: "$productId", totalQty: { $sum: "$quantity" }, totalRevenue: { $sum: { $multiply: ["$quantity", "$price"] } } } },
{ $sort: { totalRevenue: -1 } },
{ $limit: 10 },
{ $lookup: { from: "products", localField: "_id", foreignField: "_id", as: "product" } },
{ $unwind: "$product" },
{ $project: { name: "$product.name", totalQty: 1, totalRevenue: 1 } }
])
5. MongoDB: оптимизация запросов с explain
Промт: «У меня есть коллекция 'logs' с 50 млн документов и запрос по полю 'timestamp'. Вывод explain показывает COLLSCAN. Создай составной индекс, который покроет запрос и сортировку. Учти, что часто фильтруют по userId и timestamp вместе.»
Ответ AI: «Создайте индекс на (userId, timestamp). Для сортировки по убыванию используйте { userId: 1, timestamp: -1 }.»
db.logs.createIndex({ userId: 1, timestamp: -1 });
6. Redis: проектирование структуры данных для рейтинга
Промт: «Нужно хранить рейтинг статей с возможностью быстрого получения топа N. Какие структуры Redis использовать? Напиши примеры команд для добавления голоса и получения топ-10.»
Пример: Использовать Sorted Set:
ZINCRBY article:ratings 1 "article:123"
ZREVRANGE article:ratings 0 9 WITHSCORES
AI также предложит TTL для устаревших статей.
7. Redis: кеширование с инвалидацией
Промт: «Реализуй стратегию кеширования результатов сложного SQL-запроса в Redis. Время жизни кеша — 5 минут. При обновлении данных в БД нужно инвалидировать кеш. Напиши пример на Python с использованием redis-py и декоратора.»
Пример:
import redis, json
r = redis.Redis()
def cache_query(key_func, ttl=300):
def decorator(func):
def wrapper(*args, **kwargs):
key = key_func(*args, **kwargs)
cached = r.get(key)
if cached:
return json.loads(cached)
result = func(*args, **kwargs)
r.setex(key, ttl, json.dumps(result))
return result
return wrapper
return decorator
При обновлении вызываем r.delete(key).
8. MongoDB: миграция данных с $merge
Промт: «Мне нужно перенести данные из коллекции 'users_v1' в 'users_v2' с изменённой схемой. В v2 поле 'full_name' разбито на 'first_name' и 'last_name'. Напиши aggregation с $merge для атомарного обновления.»
Пример:
db.users_v1.aggregate([
{ $project: {
_id: "$_id",
first_name: { $arrayElemAt: [ { $split: ["$full_name", " "] }, 0 ] },
last_name: { $arrayElemAt: [ { $split: ["$full_name", " "] }, 1 ] },
email: 1,
created_at: 1
} },
{ $merge: { into: "users_v2", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }
])
9. PostgreSQL: партиционирование таблицы
Промт: «Таблица 'events' содержит 100 млн строк и запросы по дате становятся медленными. Создай партиционированную таблицу по месяцам и миграцию данных из старой таблицы. Учти индексы и foreign keys.»
Пример:
CREATE TABLE events (
id BIGSERIAL,
event_date DATE NOT NULL,
data JSONB
) PARTITION BY RANGE (event_date);
CREATE TABLE events_2026_07 PARTITION OF events
FOR VALUES FROM ('2026-07-01') TO ('2026-08-01');
AI предупредит, что foreign keys на партиционированные таблицы требуют осторожности.
10. Redis: блокировки для распределённых систем
Промт: «Напиши реализацию распределённой блокировки с помощью Redis (Redlock-style) на Python. Блокировка должна автоматически сниматься через 10 секунд. Покажи корректную обработку сбоев и повторных попыток.»
Пример (упрощённый):
import redis, time, uuid
r = redis.Redis()
def acquire_lock(lock_name, ttl=10):
lock_id = str(uuid.uuid4())
if r.setnx(lock_name, lock_id):
r.expire(lock_name, ttl)
return lock_id
return None
def release_lock(lock_name, lock_id):
script = """
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
"""
r.eval(script, 1, lock_name, lock_id)
Заключение
Эти 10 промтов покрывают 90% повседневных задач: от диагностики производительности до проектирования схем и написания миграций. Скопируйте их в свой AI-ассистент и адаптируйте под свои данные. Помните: всегда проверяйте сгенерированный код на тестовой базе. Используйте эти промты как шаблоны — со временем вы натренируете AI отвечать ещё точнее.
Подписывайтесь на блог Asibiont — мы делимся практическими инструментами для разработчиков каждый месяц.
Комментарии