Вы когда-нибудь ждали ответ от базы данных дольше, чем пьёте утренний кофе? Медленные запросы — это не просто раздражение, это потерянные деньги, пользователи и нервы. Но что, если я скажу, что большинство проблем с производительностью можно решить за минуты, просто правильно задав вопрос ИИ? В этой статье — 15 конкретных промтов, которые помогут вам диагностировать и ускорить PostgreSQL и MongoDB, используя лучшие практики и реальные инструменты.
Почему ИИ — ваш новый DBA
Современные языковые модели обучены на тысячах статей, документаций и реальных кейсов. Они знают, как читать EXPLAIN ANALYZE, какие индексы нужны для LIKE '%foo%', и почему $lookup в MongoDB может съесть всю память. Но без правильного промта вы получите общие советы уровня «добавьте индекс». С моими шаблонами вы превратите ИИ в эксперта, который даёт точные, применимые рекомендации.
Как читать EXPLAIN как профи
Первый шаг к оптимизации — понять, что происходит под капотом. EXPLAIN показывает план выполнения запроса, но без опыта это просто набор цифр. Вот промт, который заставит ИИ расшифровать его для вас.
Промт 1: Разбор плана EXPLAIN
Я DBA в компании с PostgreSQL 15. Вот вывод EXPLAIN ANALYZE для моего запроса:
[вставьте ваш вывод]
Объясни, что здесь происходит, простым языком. Укажи: 1) какие узлы самые дорогие, 2) где узкие места (например, Seq Scan на большой таблице), 3) что конкретно можно улучшить. Дай конкретные рекомендации.
Пример использования: Вы запустили EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123; и видите Seq Scan on orders (cost=0.00..1000.00 rows=500 width=100). ИИ объяснит, что последовательное сканирование — это плохо, и предложит создать индекс на user_id.
Индексы: создаём то, что нужно
Индексы — это суперспособность баз данных, но неправильный индекс может навредить. Эти промты помогут выбрать идеальный индекс для вашего workload.
Промт 2: Подбор индекса по паттерну запроса
У меня таблица `events` (PostgreSQL 14) с полями: id, user_id, event_type, created_at, payload (jsonb). Частые запросы:
1. SELECT * FROM events WHERE user_id = ? AND created_at BETWEEN ? AND ?;
2. SELECT count(*) FROM events WHERE event_type = ? GROUP BY event_type;
3. SELECT * FROM events WHERE payload->>'source' = 'mobile';
Какие индексы вы посоветуете? Учитывайте компромиссы: скорость записи, размер индекса. Для каждого индекса объясните, почему он подходит.
Пример использования: ИИ предложит композитный индекс (user_id, created_at) для первого запроса, частичный индекс для второго, и GIN-индекс на payload для третьего.
Промт 3: Индексы для MongoDB
У меня MongoDB 6.0, коллекция `products` с документами вида {sku: "ABC123", name: "...", category: "electronics", price: 99.99, attributes: {color: "red", size: "M"}}. Запросы:
1. db.products.find({category: "electronics", price: {$lt: 100}})
2. db.products.find({"attributes.color": "red"})
3. db.products.aggregate([{$match: {category: "electronics"}}, {$group: {_id: "$attributes.size", avg: {$avg: "$price"}}}])
Какие индексы создать? Объясните, как работает compound index и index on embedded field.
Пример: ИИ посоветует {category: 1, price: 1} для первого, {"attributes.color": 1} для второго, и, возможно, {category: 1, "attributes.size": 1, price: 1} для третьего.
Рефакторинг запросов: меньше — лучше
Иногда проблема не в индексах, а в самом запросе. Эти промты помогут переписать неэффективные операции.
Промт 4: Оптимизация подзапросов
Вот мой запрос на PostgreSQL 15, он выполняется 5 секунд на таблице 1 млн строк:
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);
Как его оптимизировать? Рассмотри варианты: JOIN, EXISTS, оконные функции. Приведи оптимизированный SQL и объясни, почему он быстрее.
Пример: ИИ заменит IN на EXISTS, что часто быстрее, или покажет, как использовать JOIN с дедупликацией.
Промт 5: Устранение N+1 запросов в MongoDB
У меня Node.js приложение с Mongoose. Я делаю цикл по пользователям и для каждого запрашиваю его заказы через await Order.find({user: user._id}). Это вызывает N+1 проблему. Как переписать с использованием $lookup или Promise.all? Покажи пример кода до и после.
Пример: ИИ предложит использовать агрегацию с $lookup для получения всех данных одним запросом, или Promise.all для параллельных запросов.
Настройка конфигурации: не только запросы
Иногда база данных тормозит из-за неправильных настроек. Эти промты помогут настроить PostgreSQL и MongoDB под ваше железо.
Промт 6: Тюнинг PostgreSQL под нагрузку
У меня PostgreSQL 16 на сервере с 8 CPU и 32 GB RAM. Workload: 70% чтение, 30% запись. Вот текущие настройки:
shared_buffers = 128MB
effective_cache_size = 512MB
work_mem = 4MB
maintenance_work_mem = 64MB
Какие значения вы посоветуете? Объясните, как вы рассчитали. Дайте готовый конфиг для postgresql.conf.
Пример: ИИ порекомендует shared_buffers = 8GB, effective_cache_size = 24GB, work_mem = 64MB и т.д., объясняя формулы.
Промт 7: Настройка MongoDB WiredTiger
У меня MongoDB 7.0, storage engine WiredTiger. 16 GB RAM. Какие настройки storage.wiredTiger.engineConfig.cacheSizeGB и другие параметры вы посоветуете? Учтите, что на сервере также работает приложение. Приведи пример конфигурационного файла mongod.conf.
Пример: ИИ посоветует выделить 50-60% RAM под кэш, например, 9.6GB, и настроить journaling.
Анализ медленных запросов: находим виновников
Не знаете, какие запросы тормозят? Эти промты помогут найти их.
Промт 8: Использование pg_stat_statements
Я включил pg_stat_statements в PostgreSQL 15. Вот вывод запроса:
SELECT query, calls, total_time, mean_time, rows FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
[вставьте вывод]
Проанализируй: какие запросы самые медленные, какие самые частые, что можно оптимизировать. Дай приоритеты: что исправить в первую очередь.
Пример: ИИ увидит, что SELECT * FROM logs WHERE date > now() - interval '1 day' занимает 80% времени, и предложит добавить индекс на date.
Промт 9: Профилирование MongoDB
В MongoDB включен профилировщик на уровне 2. Как найти самые медленные операции через db.system.profile? Покажи запросы для получения топ-10 медленных операций за последний час, с объяснением каждого поля.
Пример: ИИ даст db.system.profile.find({ts: {$gte: new Date(Date.now() - 3600000)}}).sort({millis: -1}).limit(10) и объяснит, как интерпретировать millis, docsExamined, nreturned.
Продвинутые техники: партиционирование и материализованные представления
Когда данные становятся большими, нужны более серьёзные инструменты.
Промт 10: Партиционирование таблицы PostgreSQL
У меня таблица `events` в PostgreSQL 15, 500 млн строк, растёт на 10 млн в месяц. Поле created_at. Запросы в основном за последний месяц. Посоветуйте: стоит ли партиционировать по диапазону дат? Если да, покажите SQL для создания партиционированной таблицы с месячными партициями. Как это повлияет на производительность? Какие есть подводные камни?
Пример: ИИ порекомендует партиционирование по created_at и даст код для создания таблицы с партициями на 2026 год.
Промт 11: Материализованные представления для агрегатов
У меня PostgreSQL 16. Частый запрос: SELECT date_trunc('day', created_at), count(*) FROM orders GROUP BY 1; Он выполняется на 100 млн строк и занимает 10 секунд. Как ускорить с помощью материализованного представления? Покажи, как создать его и обновлять. Обсуди частоту обновления (REFRESH MATERIALIZED VIEW) и как сделать его быстрым.
Пример: ИИ предложит создать mat_view с агрегатами по дням и обновлять его раз в час.
Работа с JSON: когда документы — это боль
И PostgreSQL, и MongoDB позволяют хранить JSON, но работа с ним требует особого подхода.
Промт 12: Оптимизация jsonb-запросов в PostgreSQL
У меня таблица `products` с полем `attributes jsonb`. Запрос: SELECT * FROM products WHERE attributes->>'color' = 'red' AND attributes->>'size' = 'M'; Он медленный. Какие индексы помогут? Рассмотри GIN и JSONB Path. Приведи примеры создания индексов и объясни, когда какой использовать.
Пример: ИИ порекомендует GIN-индекс на attributes и покажет, как использовать jsonb_path_ops для ускорения.
Промт 13: Индексы для текстового поиска в MongoDB
В MongoDB есть коллекция `articles` с полем `content`. Хочу искать по подстроке: db.articles.find({content: /regex/}). Это медленно. Как создать text index и использовать $text? В чем отличие от regex? Приведи примеры.
Пример: ИИ покажет, как создать text index и использовать $text для полнотекстового поиска, и объяснит, что regex с ^ может использовать обычный индекс.
Кэширование: снижаем нагрузку на БД
Иногда проще не ходить в базу лишний раз.
Промт 14: Внедрение Redis для кэширования
У меня PostgreSQL 16, частый запрос: SELECT * FROM products WHERE id = ?; Он выполняется 5 мс, но при 1000 rps создает нагрузку. Как использовать Redis для кэширования? Покажи пример кода на Python (redis-py) для кэширования этого запроса с TTL 10 минут. Обсуди инвалидацию кэша при обновлении продукта.
Пример: ИИ даст код с get/set и объяснит стратегию инвалидации.
Мониторинг и алерты: не дайте базе упасть
Последняя линия защиты — мониторинг.
Промт 15: Настройка мониторинга PostgreSQL с Prometheus и Grafana
У меня PostgreSQL 16 и Docker. Хочу настроить мониторинг с помощью postgres_exporter, Prometheus и Grafana. Дай docker-compose.yml, настройки экспортера и пример дашборда. Какие метрики критически важны (например, cache hit ratio, number of connections)?
Пример: ИИ предоставит готовый docker-compose и перечислит метрики.
Промт 16: Мониторинг MongoDB с MongoDB Cloud Manager
У меня MongoDB Atlas. Как настроить алерты на медленные запросы? Какие метрики отслеживать (например, opcounters, page faults)? Дай пошаговую инструкцию.
Пример: ИИ объяснит, как настроить алерты на основе query targeting.
Заключение
Эти 15 промтов — ваш набор инструментов для превращения медленных запросов в молниеносные. Но помните: ИИ — это советник, а не замена здравого смысла. Всегда проверяйте рекомендации на тестовом окружении, прежде чем применять в проде. Начните с малого: возьмите один из самых медленных запросов, запустите EXPLAIN и дайте промт ИИ. Вы удивитесь, как быстро найдёте решение. Удачной оптимизации!
Комментарии