6.1Kпросмотров
19.6%от подписчиков
25 марта 2026 г.
🎬 ВидеоScore: 6.7K
🔥 Большие таблицы в SQL - сначала план, потом запрос Самый полезный апгрейд, который реально экономит часы: не "оптимизировать запрос на глаз", а заставить базу самой показать, что она делает. На больших таблицах скорость почти всегда решают 3 вещи: правильный индекс, правильная форма запроса и правильный JOIN-порядок. ➡️ Железное правило: прежде чем трогать код, запускают EXPLAIN ANALYZE и смотрят две красные зоны - Seq Scan на большой таблице и огромные строки после JOIN. Если видишь Seq Scan - значит фильтр не поддержан индексом или условие написано так, что индекс не используется. Если после JOIN получаются миллионы строк - значит нужно сначала отфильтровать и/или агрегировать, а потом соединять. Самый мощный прием для больших таблиц: сначала выбрать маленький набор ключей (CTE или подзапрос), и только потом JOIN к тяжелой таблице. Это резко уменьшает работу базы, потому что она перестает "перемножать" всё со всем. ПЛОХО: тяжелый JOIN сразу, база тащит миллионы строк
SELECT u.id, COUNT(e.) AS events_30d
FROM users u
JOIN events e ON e.user_id = u.id
WHERE e.created_at >= NOW() - INTERVAL '30 days' AND u.country = 'TH'
GROUP BY u.id; -- ХОРОШО: сначала сузить пользователей до маленького набора, потом JOIN
WITH target_users AS ( SELECT id FROM users WHERE country = 'TH'
)
SELECT tu.id, COUNT() AS events_30d
FROM target_users tu
JOIN events e ON e.user_id = tu.id
WHERE e.created_at >= NOW() - INTERVAL '30 days'
GROUP BY tu.id; -- Индексы, которые реально помогают этому паттерну
CREATE INDEX IF NOT EXISTS idx_users_country_id ON users (country, id);
CREATE INDEX IF NOT EXISTS idx_events_user_time ON events (user_id, created_at); -- Всегда проверяй, что база использует индекс, а не Seq Scan
EXPLAIN (ANALYZE, BUFFERS)
WITH target_users AS ( SELECT id FROM users WHERE country = 'TH'
)
SELECT tu.id, COUNT(*)
FROM target_users tu
JOIN events e ON e.user_id = tu.id
WHERE e.created_at >= NOW() - INTERVAL '30 days'
GROUP BY tu.id; 🫡 Всё про Data Science 🇷🇺 Читайте нас в MAX