Что работает быстрее: SELECT или SELECT с JOIN?

«Что работает быстрее: SELECT или SELECT с JOIN?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Простой SELECT из одной таблицы, как правило, выполняется быстрее, чем SELECT с JOIN, потому что не требует операций соединения и сопоставления данных из нескольких таблиц.

Пример:

-- Быстрее: запрос к одной таблице
SELECT id, name FROM users WHERE active = TRUE;

-- Медленнее: требуется соединение и фильтрация по двум таблицам
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.active = TRUE;

Почему JOIN может быть медленнее:

  1. Вычислительная сложность: Алгоритмы соединения (Nested Loops, Hash Join, Merge Join) имеют сложность O(N*M) в худшем случае.
  2. Объём обрабатываемых данных: Системе нужно прочитать и сопоставить строки из нескольких таблиц.
  3. Отсутствие индексов: Если поля в условии ON или WHERE не проиндексированы, выполняется полное сканирование таблиц (FULL SCAN).

Как оптимизировать JOIN:

  • Индексы: Создавайте индексы для полей, используемых в условиях JOIN и WHERE.
  • Селективность: Фильтруйте данные как можно раньше, используя WHERE до операций соединения, где это возможно.
  • Выборка полей: Избегайте SELECT *, явно перечисляйте только необходимые столбцы.
  • Анализ плана запроса: Используйте EXPLAIN (или EXPLAIN ANALYZE) для понимания того, как СУБД выполняет запрос, и поиска узких мест.