Антипаттерны JOIN-ов в SQL и как их избежать

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,994
Реакции
1,564
Credits
35,633
Антипаттерны JOIN-ов в SQL и как их избежать
JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 ловушек:

1️⃣ Забыли условие соединения
SQL:
SELECT *
FROM orders
JOIN customers;
Без ON это картезианское произведение - каждая строка первой таблицы умножается на все строки второй. Легко получить миллионы ненужных записей.
Как избежать: Всегда указывай условие соединения.

2️⃣ JOIN по неиндексированным колонкам
Если соединяешь большие таблицы по полю без индекса - готовься ждать.
Как избежать: Добавь индекс на ключи соединения.
SQL:
CREATE INDEX idx_orders_customer_id ON orders(customer_id);

3️⃣ Фильтры в WHERE вместо ON
SQL:
-- Плохо
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.id
WHERE customers.region = 'EU';
LEFT JOIN превратился в INNER JOIN, потому что фильтр в WHERE отсекает NULL-строки.
Как избежать: Фильтруй в ON, если хочешь сохранить LEFT JOIN:
SQL:
LEFT JOIN customers
  ON orders.customer_id = customers.id AND customers.region = 'EU';

4️⃣ SELECT *** в сложных JOIN-ах
Такая выборка тянет все колонки всех таблиц. Много лишних данных + риск коллизии имён колонок.
Как избежать: Явно указывай нужные поля.

Вывод: JOIN - как скальпель. В умелых руках ускоряет, в неумелых - режет производительность.