Вы когда-нибудь ждали выполнения запроса дольше, чем пьёте утренний кофе? Я — да, и это больно. Когда база данных начинает тормозить, а пользователи жалуются на медленные страницы, приходит время оптимизации. Но как быстро найти узкое место? Традиционный подход — вручную анализировать EXPLAIN, смотреть на индексы, переписывать запросы. Это занимает часы. А что, если я скажу вам, что с помощью правильно составленных промтов для ИИ можно сократить этот процесс до минут? В этой статье я собрал подборку промтов, которые помогут вам ускорить PostgreSQL и MongoDB в разы. Вы узнаете, как использовать ИИ для анализа планов запросов, поиска пропущенных индексов, рефакторинга и даже для настройки конфигурации. Поехали!
Базовые промты: начинаем с диагностики
Прежде чем что-то оптимизировать, нужно понять, что именно тормозит. Эти промты помогут вам быстро оценить состояние базы данных и найти очевидные проблемы.
1. Анализ медленного запроса с помощью EXPLAIN
Задача: Получить подробный разбор плана выполнения запроса и выявить узкие места.
Промт:
Проанализируй план выполнения следующего SQL-запроса в PostgreSQL. Объясни, какие операции занимают больше всего времени, и предложи конкретные меры по оптимизации. Учти, что таблица orders содержит 10 миллионов строк, а запрос выполняется за 15 секунд.
EXPLAIN (ANALYZE, BUFFERS) SELECT customer_id, COUNT(*) FROM orders WHERE status = 'shipped' GROUP BY customer_id ORDER BY COUNT(*) DESC LIMIT 10;
Пример результата:
ИИ проанализирует план и укажет, что, например, используется Seq Scan по таблице orders (что плохо для 10M строк), предложит создать индекс на status, а возможно, и на (status, customer_id) для покрывающего индекса. Также может предложить использовать материализованное представление для агрегатов, если данные меняются редко.
2. Поиск пропущенных индексов
Задача: Определить, какие индексы стоит добавить для ускорения запросов.
Промт:
Вот список самых частых запросов к моей базе PostgreSQL. Определи, какие индексы нужно создать, чтобы ускорить их выполнение. Для каждого индекса укажи команду CREATE INDEX.
1. SELECT * FROM users WHERE email = 'test@example.com';
2. SELECT * FROM orders WHERE user_id = 123 AND created_at > '2025-01-01';
3. SELECT product_id, SUM(quantity) FROM order_items GROUP BY product_id;
Пример результата:
ИИ предложит:
- Уникальный индекс на users(email) (если ещё нет).
- Составной индекс на orders(user_id, created_at).
- Индекс на order_items(product_id) для GROUP BY.
3. Профилирование MongoDB: find().explain()
Задача: Понять, как MongoDB выполняет запрос, и найти причины медленной работы.
Промт:
У меня есть MongoDB коллекция products с 5 миллионами документов. Запрос db.products.find({category: 'electronics', price: {$lt: 1000}}).sort({rating: -1}).limit(10) выполняется 3 секунды. Выполни explain и проанализируй результат. Предложи оптимизацию.
Пример результата:
ИИ объяснит, что, скорее всего, используется COLLSCAN, и предложит создать составной индекс {category: 1, price: 1, rating: -1}. Также может посоветовать использовать проекцию, чтобы уменьшить объём передаваемых данных.
Продвинутые промты: углубляемся в детали
Когда базовые промты не дают результата, пора копать глубже. Эти промты помогут вам настроить индексы, переписать запросы и оптимизировать схему.
4. Рефакторинг сложного SQL-запроса
Задача: Переписать медленный запрос с подзапросами и корреляциями на более эффективный вариант.
Промт:
Перепиши следующий SQL-запрос для PostgreSQL, чтобы он выполнялся быстрее. Используй JOIN вместо подзапросов, если это возможно, и объясни, почему новый вариант лучше.
SELECT * FROM orders o WHERE o.total > (SELECT AVG(total) FROM orders WHERE customer_id = o.customer_id) AND o.status = 'paid';
Пример результата:
ИИ может предложить использовать оконную функцию AVG() OVER (PARTITION BY customer_id) или JOIN с агрегированным подзапросом. Объяснит, что коррелированный подзапрос выполняется для каждой строки, а JOIN — один раз.
5. Настройка конфигурации PostgreSQL
Задача: Подобрать оптимальные параметры конфигурации для конкретного workload.
Промт:
У меня PostgreSQL 16 на сервере с 16 ГБ RAM и SSD. База данных используется для OLTP-нагрузки с большим количеством запросов на чтение и запись. Какие параметры в postgresql.conf стоит изменить для улучшения производительности? Дай конкретные значения и поясни, почему.
Пример результата:
ИИ предложит увеличить shared_buffers до 4 ГБ, effective_cache_size до 12 ГБ, work_mem до 64 МБ, и настроить wal_buffers. Объяснит, как это влияет на кэширование и сортировки.
6. Оптимизация запросов с JOIN в MongoDB
Задача: Улучшить производительность запросов с $lookup (аналог JOIN).
Промт:
У меня в MongoDB есть коллекции users и orders. Я выполняю агрегацию с $lookup, чтобы получить заказы пользователя. Запрос выполняется очень медленно. Вот код:
db.users.aggregate([{ $match: { _id: ObjectId('...') } }, { $lookup: { from: 'orders', localField: '_id', foreignField: 'user_id', as: 'orders' } }])
Как ускорить этот запрос? Предложи варианты.
Пример результата:
ИИ предложит создать индекс на orders.user_id, использовать $lookup с указанием pipeline для фильтрации, или даже денормализовать данные (хранить заказы внутри документа пользователя) для частых запросов.
Экспертные промты: мастерство оптимизации
Для тех, кто хочет выжать максимум, — промты, которые помогут найти скрытые проблемы и использовать продвинутые техники.
7. Анализ и оптимизация EXPLAIN ANALYZE с учётом статистики
Задача: Глубокий анализ плана запроса с учётом статистики таблиц и распределения данных.
Промт:
Вот план выполнения запроса из PostgreSQL. На основе статистики таблиц (я предоставлю pg_stats) объясни, почему оптимизатор выбрал этот план, и предложи, как его улучшить. Также проверь, не устарела ли статистика, и нужно ли запустить ANALYZE.
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM large_table WHERE date_column BETWEEN '2025-01-01' AND '2025-12-31';
Пример результата:
ИИ проанализирует план, увидит, что используется Seq Scan, и посоветует создать индекс на date_column, а также проверить, обновлялась ли статистика (last_analyze). Если нет — запустить ANALYZE.
8. Использование pg_hint_plan для принудительного выбора плана
Задача: Заставить PostgreSQL использовать конкретный план выполнения, когда оптимизатор ошибается.
Промт:
У меня есть запрос, который PostgreSQL выполняет неоптимально. Я хочу использовать расширение pg_hint_plan, чтобы заставить его использовать индекс idx_orders_status. Напиши, как включить расширение и добавить хинт в запрос.
Пример результата:
ИИ даст инструкции: установить расширение, добавить комментарий /*+ IndexScan(orders idx_orders_status) */ перед SELECT. Объяснит, когда это полезно и какие есть риски.
9. Оптимизация запросов с полнотекстовым поиском
Задача: Ускорить полнотекстовый поиск в PostgreSQL с помощью GIN-индексов.
Промт:
У меня есть таблица articles с колонкой body. Я выполняю полнотекстовый поиск: SELECT * FROM articles WHERE to_tsvector('russian', body) @@ to_tsquery('russian', 'оптимизация & запросов');. Запрос медленный. Что сделать?
Пример результата:
ИИ предложит создать GIN-индекс на to_tsvector('russian', body), а также использовать отдельную колонку для tsvector, чтобы не вычислять его каждый раз. Покажет пример создания индекса.
10. Диагностика блокировок и взаимоблокировок
Задача: Найти и устранить проблемы с блокировками, которые замедляют выполнение запросов.
Промт:
У меня в PostgreSQL периодически возникают взаимоблокировки (deadlocks). Как найти запросы, которые блокируют друг друга, и что можно сделать, чтобы их избежать? Приведи примеры SQL-запросов для диагностики.
Пример результата:
ИИ предложит запросы к pg_locks, pg_stat_activity, а также советует использовать логирование блокировок (log_lock_waits = on). Объяснит, как анализировать вывод.
11. Оптимизация MongoDB с помощью индексов с частичной фильтрацией
Задача: Создать частичные индексы для ускорения запросов с условиями на редкие значения.
Промт:
У меня в MongoDB есть коллекция events с полем type (например, 'click', 'purchase', 'error'). Запросы часто ищут только 'error'. Создай частичный индекс, который ускорит такие запросы, и объясни, как это работает.
Пример результата:
ИИ предложит создать индекс: db.events.createIndex({type: 1, created_at: -1}, {partialFilterExpression: {type: 'error'}}). Объяснит, что это уменьшит размер индекса и ускорит запросы.
12. Использование материализованных представлений для агрегатов
Задача: Ускорить сложные агрегатные запросы, которые выполняются часто, с помощью материализованных представлений.
Промт:
У меня есть запрос, который вычисляет ежедневную выручку по продуктам. Он выполняется долго, но данные меняются раз в день. Как использовать материализованное представление в PostgreSQL, чтобы ускорить этот запрос? Напиши SQL.
Пример результата:
ИИ напишет CREATE MATERIALIZED VIEW daily_revenue AS SELECT date, product_id, SUM(amount) FROM sales GROUP BY date, product_id; и посоветует обновлять его с помощью REFRESH MATERIALIZED VIEW CONCURRENTLY. Объяснит плюсы и минусы.
Заключение
Оптимизация запросов — это искусство, но с помощью ИИ-промтов вы можете превратить её в науку. Мы рассмотрели 12 промтов, которые покрывают базовые и продвинутые техники для PostgreSQL и MongoDB. Начните с простых — анализа EXPLAIN, поиска пропущенных индексов. Затем переходите к рефакторингу и настройке конфигурации. А когда почувствуете уверенность — используйте экспертные промты для решения сложных задач, таких как блокировки или частичные индексы. Попробуйте применить эти промты в своих проектах — и вы увидите, как время выполнения запросов сократится в разы. Если у вас есть свои проверенные промты — делитесь в комментариях, давайте учиться друг у друга!
Комментарии