Антипаттерны JOIN-ов в SQL и как их избежать
JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 ловушек:
Забыли условие соединения
Без ON это картезианское произведение - каждая строка первой таблицы умножается на все строки второй. Легко получить миллионы ненужных записей.
Как избежать: Всегда указывай условие соединения.
JOIN по неиндексированным колонкам
Если соединяешь большие таблицы по полю без индекса - готовься ждать.
Как избежать: Добавь индекс на ключи соединения.
Фильтры в WHERE вместо ON
LEFT JOIN превратился в INNER JOIN, потому что фильтр в WHERE отсекает NULL-строки.
Как избежать: Фильтруй в ON, если хочешь сохранить LEFT JOIN:
SELECT *** в сложных JOIN-ах
Такая выборка тянет все колонки всех таблиц. Много лишних данных + риск коллизии имён колонок.
Как избежать: Явно указывай нужные поля.
Вывод: JOIN - как скальпель. В умелых руках ускоряет, в неумелых - режет производительность.
JOIN - мощная штука, но может легко превратиться в генератор тормозов и дублей. Вот топ-4 ловушек:

SQL:
SELECT *
FROM orders
JOIN customers;
Как избежать: Всегда указывай условие соединения.

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

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

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