Ускоряем JOIN-ы в больших таблицах

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,621
Реакции
1,555
Credits
33,871
Mini-гайд: ускоряем JOIN-ы в больших таблицах
JOIN-ы — мощный инструмент SQL, но на больших объёмах данных могут стать узким горлышком. Вот 5 проверенных способов ускорить их:

1. Индексы по ключам соединения
Без индекса — каждый JOIN превращается в полный перебор.
Пример:
SQL:
   CREATE INDEX idx_user_id ON orders(user_id);
2. Ограничь объём данных до JOIN-а
Фильтруй и агрегируй данные до объединения.
Вместо:
SQL:
   SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE u.country = 'DE';
Лучше:
SQL:
   WITH german_users AS (
     SELECT id FROM users WHERE country = 'DE'
   )
   SELECT * FROM orders o JOIN german_users g ON o.user_id = g.id;
3. Учитывай тип JOIN-а
INNER JOIN обычно быстрее OUTER JOIN, особенно при наличии NOT NULL. Иногда EXISTS работает быстрее, чем LEFT JOIN.
4. Следи за типами данных
JOIN по полям с разными типами (например, int и varchar) = неэффективный cast + тормоза.
5. Проверь планы выполнения (EXPLAIN)
Не гадай, а смотри, что реально происходит. EXPLAIN ANALYZE — твой друг.

Даже один лишний JOIN может уронить производительность. Внимательность + EXPLAIN = уверенность.