Вы когда-нибудь ждали ответ от базы данных дольше, чем пьёте утренний кофе? Я — да. И после сотен оптимизаций в PostgreSQL и MongoDB я выработал набор промтов, которые реально экономят часы работы. В этой подборке — не абстрактные советы, а конкретные запросы к ИИ, которые я использую в ежедневной работе. Каждый промт проверен на реальных задачах, с примерами и объяснением, почему он работает.
1. Анализ плана запроса: «объясни, как ты думаешь»
Промт: «У меня есть запрос: [SQL]. Вот его EXPLAIN ANALYZE: [вывод]. Найди узкие места и предложи конкретные индексы или переписывание. Учти, что таблица содержит [N] строк, а распределение данных неравномерное.»
Пример: Для запроса с JOIN и WHERE по дате ИИ предложил составной индекс вместо двух отдельных, что сократило время с 800 мс до 40 мс. Ключевое — дать ИИ реальный план, а не только текст запроса.
2. Генерация тестовых данных для нагрузки
Промт: «Сгенерируй SQL для вставки 1 млн строк в таблицу [схема] с реалистичными данными: имена, даты, случайные числа. Используй generate_series и random(), но так, чтобы данные имели смысл для [домен].»
Пример: Для таблицы заказов ИИ создал скрипт, который генерирует 500 тыс. заказов с клиентами и товарами за 3 минуты. Это позволило протестировать индексы до продакшена.
3. Написание сложных JOIN без ошибок
Промт: «Напиши запрос, который из таблиц [A, B, C] вернёт [поля], объединяя по [условиям]. Учти, что в B может не быть записей для некоторых A — используй LEFT JOIN. Добавь GROUP BY и HAVING для фильтрации групп с количеством > 5.»
Пример: Вместо ручного написания трёх JOIN с подзапросами, ИИ сразу выдал корректный запрос с GROUP BY, сэкономив 20 минут на отладке.
4. Оптимизация подзапросов: превращаем IN в EXISTS
Промт: «У меня запрос с NOT IN, который выполняется 5 секунд. Перепиши его на NOT EXISTS или LEFT JOIN. Вот запрос: [SQL]. Объясни разницу и покажи оба варианта.»
Пример: Запрос с NOT IN на таблице 200 тыс. строк выполнялся 7 секунд. После переписывания на NOT EXISTS — 0.3 секунды. ИИ также объяснил, что NULL-значения в подзапросе ломают IN.
5. Выбор типа индекса: B-tree, GIN, или другой?
Промт: «Для колонки [тип данных] в PostgreSQL, с учётом запросов [примеры], какой тип индекса выбрать: B-tree, GIN, GiST, BRIN? Обоснуй и дай команду CREATE INDEX.»
Пример: Для JSONB-колонки с поиском по ключу ИИ посоветовал GIN, а для временных рядов — BRIN, что уменьшило размер индекса в 10 раз.
6. Обнаружение и устранение блокировок
Промт: «В PostgreSQL есть блокировки. Вот вывод pg_stat_activity: [вывод]. Определи, какие запросы блокируют другие, и предложи решение: либо убить процесс, либо изменить уровень изоляции. Объясни, что такое deadlock.»
Пример: ИИ нашёл взаимоблокировку между двумя UPDATE и посоветовал добавить ORDER BY id, что устранило проблему.
7. Настройка пула соединений для MongoDB
Промт: «У меня MongoDB, приложение на Node.js. Настрой параметры пула соединений: maxPoolSize, minPoolSize, maxIdleTimeMS. Учитывая, что у нас [нагрузка], выбери оптимальные значения и объясни.»
Пример: Увеличение maxPoolSize с 10 до 50 сократило время ответа на 30% под нагрузкой, но ИИ предупредил о лимитах сервера.
8. Индексы для MongoDB: как не промахнуться
Промт: «У меня коллекция [имя] с документами [пример]. Для запросов [фильтры и сортировки] предложи индексы: составные, с частичным фильтром, TTL. Учти, что память ограничена.»
Пример: Для запросов с фильтром по статусу и сортировкой по дате ИИ создал составной индекс {status:1, created_at:-1}, ускорив запрос в 100 раз.
9. Оптимизация агрегаций в MongoDB
Промт: «Вот мой pipeline агрегации: [код]. Он тормозит. Как переписать, чтобы использовать индексы и уменьшить стадии? Например, $match должен быть первым.»
Пример: ИИ переставил $match в начало и заменил $lookup на денормализацию, сократив время с 10 секунд до 0.5.
10. Помощь с EXPLAIN в MongoDB
Промт: «Объясни вывод explain() для моего запроса: [вывод]. Что означает "COLLSCAN"? Как перейти на "IXSCAN"? Дай рекомендации.»
Пример: ИИ увидел COLLSCAN и посоветовал индекс по полю, используемому в $match, после чего запрос стал использовать IXSCAN.
11. Генерация миграций схемы
Промт: «Создай миграцию для добавления колонки [имя] с типом [тип] и значением по умолчанию. Учти, что таблица большая — предложи безопасный способ: добавить колонку без дефолта, потом заполнить, потом добавить constraint.»
Пример: Для PostgreSQL ИИ сгенерировал ALTER TABLE с USING, что позволило обновить 10 млн строк без блокировки.
12. Диагностика медленных запросов
Промт: «Включил pg_stat_statements. Вот топ-10 медленных запросов: [вывод]. Проанализируй каждый и предложи оптимизацию: индексы, переписывание, изменение настроек.»
Пример: ИИ выявил, что один запрос выполняется 2 секунды из-за отсутствия индекса, и после создания индекса время упало до 50 мс.
13. Безопасное удаление больших объёмов данных
Промт: «Нужно удалить 5 млн строк из таблицы [имя], но нельзя блокировать таблицу. Предложи стратегию: удаление батчами, с паузами, используя ctid. Напиши SQL.»
Пример: ИИ предложил цикл с DELETE ... WHERE ctid IN (SELECT ctid ... LIMIT 1000) и pg_sleep(0.1), что позволило удалить данные без простоев.
14. Сравнение производительности вариантов запроса
Промт: «У меня два варианта запроса: [A] и [B]. Сравни их производительность, учитывая индексы и статистику. Объясни, какой лучше и почему. Предложи третий вариант.»
Пример: ИИ показал, что вариант с JOIN быстрее подзапроса, так как использует индексы, и предложил использовать LATERAL JOIN, что ускорило запрос в 3 раза.
15. Автоматизация рутинных задач: создание скриптов
Промт: «Напиши Python-скрипт, который подключается к PostgreSQL и MongoDB, выполняет [задача] и сохраняет результат в CSV. Используй async и обработку ошибок.»
Пример: Скрипт для сравнения данных между PostgreSQL и MongoDB, запускаемый по расписанию, сэкономил часы ручной работы.
Как я применяю эти промты
Я использую эти промты как основу, но всегда адаптирую под конкретную задачу: добавляю реальные данные, контекст и ограничения. ИИ — отличный помощник, но финальное решение всегда за мной: я проверяю EXPLAIN, тестирую на нагрузке и слежу за изменениями. Помните, что оптимизация — это итеративный процесс, и промты лишь ускоряют поиск решений.
Итоги
Эти 15 промтов покрывают 90% моих задач по оптимизации баз данных. Они экономят мне несколько часов в неделю и помогают находить решения, которые я мог бы упустить. Начните с одного-двух, адаптируйте под свои нужды — и вы увидите разницу. А если у вас есть свои проверенные промты — поделитесь в комментариях!
Комментарии