Главная / ИИ агент для программиста / ИИ для баз данных

ИИ для баз данных

Агент проектирует схемы, оптимизирует запросы и чинит медленные SQL — база данных перестаёт быть узким местом

×8 быстрее оптимизация запросов с агентом
95% медленных запросов ускоряются после анализа
10 мин схема БД с нуля вместо 2 часов

Знакомо?

🐌
Запрос работает 12 секунд — непонятно почему
EXPLAIN ANALYZE показывает Seq Scan, Nested Loop, Sort. Вроде индекс есть, но не используется. Читаешь план выполнения 30 минут, пробуешь разные индексы наугад.
🏗️
Схема разрослась — невозможно менять
80 таблиц, связи во все стороны, nullable поля «на всякий случай», JSON-колонки «для гибкости». Добавить фичу — 3 миграции и молитва, чтобы ничего не сломалось.
📝
Миграции — русская рулетка
ALTER TABLE на таблицу с 50 млн строк — залочит на 20 минут? Или нет? Откатить миграцию — а down() не написан. Или написан, но не тестировался.
🔀
Нормализация vs производительность
По учебнику — 3NF, 6 JOIN-ов на каждый запрос, медленно. Денормализовать — быстро, но дублирование данных и баги при обновлении. Где баланс — непонятно.

Как разработчики используют агента для баз данных

1
Стартап — проектирование БД с нуля
Фаундер с бэкенд-опытом проектирует маркетплейс. С агентом спроектировал схему за вечер — с нормализацией, индексами и стратегией масштабирования.
Настройка
👤
Пользователь
Делаю маркетплейс б/у вещей (типа Avito). Сущности: пользователи, объявления, категории (дерево), фото, избранное, чат между продавцом и покупателем, отзывы, города. PostgreSQL. Помоги спроектировать схему — чтобы потом не переделывать.
🤖
Агент
📐 Схема маркетплейса — проектирование на рост:

Ключевые решения сразу:

1️⃣ Категории (дерево): Materialized Path, не Adjacency List
path VARCHAR: "electronics/phones/iphone"
• Запрос всех подкатегорий: WHERE path LIKE 'electronics/%' — один запрос, один индекс
• Альтернатива ltree: path ltree + GiST-индекс — нативная поддержка в PostgreSQL

2️⃣ Фото: отдельная таблица с position, не JSON-массив
• Легко менять порядок, удалять по одному, лимитировать

3️⃣ Чат: отдельные таблицы conversations + messages
• conversation привязан к объявлению (buyer + seller + listing)

4️⃣ Геолокация: PostGIS для поиска «рядом со мной»

Прислать полную схему с CREATE TABLE, индексами и объяснением каждого решения?
Ежедневное использование
👤
Пользователь
Схему утвердили, проект растёт — уже 500К объявлений. Поиск по категории + городу + цене тормозит. Запрос: SELECT * FROM listings WHERE category_path LIKE 'electronics/%' AND city_id = 5 AND price BETWEEN 1000 AND 50000 AND status = 'active' ORDER BY created_at DESC LIMIT 20. Сейчас 800 мс. Как ускорить?
🤖
Агент
⚡ Оптимизация поиска по каталогу — 800 мс → 15 мс:

Проблема: 4 условия фильтрации + сортировка. Один B-tree индекс не покроет все комбинации эффективно.

Решение — составной индекс + partial:
-- Основной индекс для каталога (покрывает 90% запросов):
CREATE INDEX idx_listings_catalog
ON listings(city_id, category_path text_pattern_ops, created_at DESC)
WHERE status = 'active';

-- Для фильтра по цене — отдельный индекс:
CREATE INDEX idx_listings_price
ON listings(city_id, price)
WHERE status = 'active';


Почему так:
WHERE status = 'active' — partial index, ~70% строк (архивные не индексируются)
city_id первый — равенство, высокая селективность
text_pattern_ops — для LIKE 'prefix%' по category_path
created_at DESC — сортировка без дополнительного Sort

Для сложных фильтров (цена + категория + город + сортировка) рассмотрите GIN-индекс или Elasticsearch, когда объявлений будет > 5 млн.
2
Бэкенд-разработчик — миграция с MySQL на PostgreSQL
Проект на MySQL 5.7, нужно мигрировать на PostgreSQL для jsonb, full-text search и RLS. С агентом спланировал и выполнил миграцию за 3 дня.
Настройка
👤
Пользователь
У нас MySQL 5.7, проект на Laravel. Хотим мигрировать на PostgreSQL: нужен jsonb для гибких атрибутов товаров, нормальный full-text search (MySQL FTS — боль), и RLS для мультитенантности. 40 таблиц, 15 млн строк. Как спланировать миграцию?
🤖
Агент
🔀 План миграции MySQL → PostgreSQL:

Оценка: 3 дня при 40 таблицах / 15 млн строк

День 1 — Подготовка:
1. Аудит несовместимостей MySQL → PG:
UNSIGNED INTINTEGER (PG не имеет unsigned)
TINYINT(1)BOOLEAN
DATETIMETIMESTAMPTZ (с часовым поясом!)
ENUMVARCHAR + CHECK или CREATE TYPE
AUTO_INCREMENTGENERATED ALWAYS AS IDENTITY
GROUP BY — PG строгий: все неагрегатные колонки в GROUP BY
2. Конвертация миграций Laravel:
config/database.php → pgsql
• Проверить все raw-запросы на MySQL-специфичный синтаксис

День 2 — Перенос данных:
pgloader — автоматическая миграция данных из MySQL в PG
• Проверка: count по каждой таблице, выборочная сверка

День 3 — Тестирование + переключение:
• Прогон всех тестов на PG
• Dual-write (опционально) или planned downtime 30 мин

Прислать список ваших миграций или SHOW CREATE TABLE для основных таблиц? Начну с конвертации.
Ежедневное использование
👤
Пользователь
Перенесли! Но один запрос, который в MySQL работал 200 мс, в PostgreSQL — 3 секунды. Полнотекстовый поиск: SELECT * FROM products WHERE MATCH(name, description) AGAINST ('кроссовки nike' IN BOOLEAN MODE). Как правильно сделать FTS в PostgreSQL?
🤖
Агент
🔍 Full-Text Search в PostgreSQL — правильно:

MySQL MATCH AGAINST → PostgreSQL to_tsvector + to_tsquery:

-- 1. Добавить tsvector-колонку (денормализация для скорости):
ALTER TABLE products ADD COLUMN search_vector tsvector;

-- 2. Заполнить (русский + английский):
UPDATE products SET search_vector =
setweight(to_tsvector('russian', coalesce(name, '')), 'A') ||
setweight(to_tsvector('russian', coalesce(description, '')), 'B');

-- 3. GIN-индекс:
CREATE INDEX idx_products_search ON products USING GIN(search_vector);

-- 4. Триггер для автообновления:
CREATE FUNCTION products_search_trigger() RETURNS trigger AS $$
BEGIN
NEW.search_vector :=
setweight(to_tsvector('russian', coalesce(NEW.name, '')), 'A') ||
setweight(to_tsvector('russian', coalesce(NEW.description, '')), 'B');
RETURN NEW;
END $$ LANGUAGE plpgsql;

CREATE TRIGGER tsvector_update BEFORE INSERT OR UPDATE ON products
FOR EACH ROW EXECUTE FUNCTION products_search_trigger();

-- 5. Запрос:
SELECT *, ts_rank(search_vector, q) AS rank
FROM products, plainto_tsquery('russian', 'кроссовки nike') q
WHERE search_vector @@ q
ORDER BY rank DESC
LIMIT 20;


📌 Преимущества над MySQL FTS:
• Веса: setweight(A/B/C/D) — name важнее description
• Русская морфология из коробки: «кроссовок» найдёт «кроссовки»
ts_rank — релевантность, не бинарный match
• GIN-индекс — ~5 мс на 15 млн строк
3
Аналитик — сложные SQL-запросы для отчётов
Бизнес-аналитик пишет SQL для дашбордов. С агентом — сложный запрос с оконными функциями и CTE за 5 минут вместо часа.
Настройка
👤
Пользователь
Я аналитик, пишу SQL для дашбордов в Metabase. Данные в PostgreSQL. Часто нужны: retention, cohort-анализ, скользящие средние, воронки. SQL знаю, но оконные функции и рекурсивные CTE — каждый раз с трудом. Помоги разбираться быстрее.
🤖
Агент
📊 Формат работы — SQL для аналитики:

Что я делаю:
1. Пишу SQL-запросы для отчётов по вашему описанию
2. Объясняю каждую оконную функцию и CTE
3. Оптимизирую для Metabase (чтобы дашборд не тормозил)

Типичные задачи, которые решаю за 2-5 минут:
• Retention по когортам (неделя/месяц регистрации)
• Конверсионная воронка с временными рамками
• LTV по когортам с накопительным итогом
• Скользящее среднее за N дней
• Ранжирование (топ-10 по каждой категории)
• Year-over-year сравнение

Формат ответа:
• Готовый SQL (copy-paste в Metabase)
• Комментарии к сложным частям
• Если нужно — объяснение как работает оконная функция

Присылайте задачу + структуру таблиц (или хотя бы названия колонок).
Ежедневное использование
👤
Пользователь
Нужен retention по месячным когортам. Таблицы: users (id, created_at), events (user_id, event_type, created_at). Хочу таблицу: когорта (месяц регистрации) × месяц после регистрации (0, 1, 2...) → процент активных.
🤖
Агент
📊 Retention по месячным когортам:

WITH cohorts AS (
SELECT
id AS user_id,
date_trunc('month', created_at)::date AS cohort_month
FROM users
),
activity AS (
SELECT DISTINCT
e.user_id,
date_trunc('month', e.created_at)::date AS activity_month
FROM events e
WHERE e.event_type = 'page_view' -- или любое целевое действие
),
cohort_size AS (
SELECT cohort_month, count(*) AS users_count
FROM cohorts
GROUP BY cohort_month
),
retention AS (
SELECT
c.cohort_month,
EXTRACT(YEAR FROM age(a.activity_month, c.cohort_month)) * 12 +
EXTRACT(MONTH FROM age(a.activity_month, c.cohort_month)) AS month_number,
count(DISTINCT c.user_id) AS active_users
FROM cohorts c
JOIN activity a ON a.user_id = c.user_id
AND a.activity_month >= c.cohort_month
GROUP BY c.cohort_month, month_number
)
SELECT
r.cohort_month,
cs.users_count AS cohort_size,
r.month_number,
r.active_users,
round(100.0 * r.active_users / cs.users_count, 1) AS retention_pct
FROM retention r
JOIN cohort_size cs ON cs.cohort_month = r.cohort_month
WHERE r.month_number <= 12 -- первые 12 месяцев
ORDER BY r.cohort_month, r.month_number;


📌 Для Metabase: используйте pivot-таблицу (Pivot table visualization), cohort_month — строки, month_number — колонки, retention_pct — значения. Получится классическая retention-таблица.

Вопросы про ИИ для баз данных

Агент поддерживает PostgreSQL и MySQL?
Да. А также SQLite, MS SQL, MongoDB и другие. Агент знает синтаксис, особенности оптимизатора и best practices каждой СУБД.
Можно оптимизировать запрос по EXPLAIN?
Да. Пришлите EXPLAIN ANALYZE — агент разберёт план выполнения, найдёт узкое место и предложит индекс или перепишет запрос.
Агент имеет доступ к моей базе?
Нет. Агент работает с описанием схемы и текстом запросов. Данные не передаются. Вы можете выполнять его рекомендации в своей БД.
Подходит для NoSQL (MongoDB, Redis)?
Да. Агент поможет с моделированием документов в MongoDB, настройкой индексов, агрегациями, а также со структурами данных Redis и паттернами кэширования.
Может помочь с ORM (Django, SQLAlchemy, Eloquent)?
Да. Агент знает ORM всех популярных фреймворков — поможет с N+1, миграциями, raw-запросами и переводом SQL в ORM-синтаксис.

Попробуй ИИ агента за 490 ₽

7 дней без ограничений. Настройка за 3 минуты — бот уже ждёт в Telegram.

Попробовать за 490 ₽ — 7 дней ← ИИ агент для программиста