Возможность использования Inner Join в leftjoin v.s. несколько левых соединений - PullRequest
3 голосов
/ 10 июня 2011

У меня вопрос по производительности MySQL

Query1:

select departments.*, booth_feature.some_feature
from departments
left join booth on booth.dept_id = departments.dept_id
left join booth_feature  on  booth.booth_id=booth_feature.booth_id

Query2:

select departments.*, booth_feature.some_feature
from departments
left join (booth, booth_feature) on ( booth.dept_id = departments.dept_id and booth.booth_id=booth_feature.booth_id)

Предполагая, что: отдел может иметь несколько кабин

1 кабина => 1 функция кабины

и столы отделов, и столы являются большими столами.

Используя объяснение, первый запрос выглядит лучше (он проверяет стенд перед booth_feature), несмотря на то, что левое соединение обычно дороже внутреннего соединения. Это правильно?

1 Ответ

1 голос
/ 05 июля 2011

Вы в основном выполняете полное перекрестное соединение между booth и booth_feature во втором запросе, если эти таблицы растут большими, это может быть довольно дорогостоящим. Кроме того, оптимизатор не сможет интеллектуально объединить «отделы» с перекрестным продуктом, поскольку ему необходимо рассчитать полный перекрестный продукт, прежде чем он сможет объединить его с отделами. Из-за отсутствия предложения объединения (что делает его полным перекрестным продуктом).

в первом запросе оптимизатор может использовать индексы из отделов и киосков, а затем использовать ссылку (тип REF в выводе MYSQL EXPLAIN) из этого результата (на основе обоих индексов) в другой индекс (из booth_features)

...