MySQL: какое соединение лучше между левым внешним соединением и внутренним соединением

10

Какое соединение лучше выполнить, если все они дают одинаковый результат? Например, у меня есть две таблицы employees(emp_id,name, address, designation, age, sex)и work_log(emp_id,date,hours_wored). Чтобы получить некоторые конкретные результаты, оба inner joinи left joinдает тот же результат. Но у меня все еще есть некоторые сомнения, которые не ограничиваются только этим вопросом.

  • какое объединение является более эффективным, которое следует предпочесть в случае одинаковых значений результата?
  • Какие еще факторы необходимо учитывать при подаче заявки на вступление?
  • Есть ли связь между внутренним и перекрестным соединением?
ursitesion
источник

Ответы:

14

Не существует «лучшего» или «худшего» типа соединения. Они имеют разное значение и должны использоваться в зависимости от этого.

В вашем случае, вы , вероятно , не имеют сотрудников с не work_log (ни одной строки в этой таблице), так LEFT JOINи JOINбудут эквивалентны в результатах. Однако, если бы у вас была такая вещь (новый сотрудник без зарегистрированного журнала work_log), то JOINэтот сотрудник пропустил бы пустошь, в то время как при левом соединении (первая таблица которого сотрудники) показывали бы все из них, и при наличии нуля в полях из work_log не совпадают.

Визуальное объяснение типов JOIN

Опять же, производительность является второстепенной вещью для правильности запроса. Некоторые люди говорят, что вы не должны использовать LEFT JOINs. Это правда, что LEFT JOIN заставляет оптимизатор выполнить запрос в одном конкретном порядке, предотвращая некоторые оптимизации (переупорядочение таблиц) в некоторых случаях. Вот один пример . Но вы не должны выбирать одно из другого, если правильность / смысл жертвуются, так как ВНУТРЕННЕЕ СОЕДИНЕНИЕ не хуже по своей сути. Остальные обычные оптимизации применяются как обычно.

Таким образом, не используйте, LEFT JOINесли вы действительно имеете в виду INNER JOIN.

В MySQL CROSS JOIN, INNER JOINи JOINодни и те же. В стандартном и семантическом CROSS JOINвыражениях a - это INNER JOINбез ONусловия, поэтому вы получаете каждую комбинацию строк между таблицами.

У вас есть примеры всех семантических типов объединения в Википедии . На практике в MySQL мы склонны писать только JOINи LEFT JOIN.

jynus
источник
1
Gr8 объяснение @jynus. К счастью, я получил ответ на мой вопрос только от вас.
Ursitesion
1 соответствующий рисунок лучше, чем 1000 слов. Ты сделал это?
Fr0zenFyr
Нет, это не так, атрибуция находится внизу изображения codeproject.com/Articles/33052/… Хотя использование диаграмм Венна для представления объединений столь же старо, как и его алгебраическая формализация: en.wikipedia.org/wiki/Relational_algebra
17
Я начал с набора комментариев, потом понял, что все сводится к - это зависит от вашего запроса. +1 от меня!
iheanyi
0

Какое соединение лучше, если все они дают одинаковый результат?

В дополнение к предыдущему ответу, насколько я знаю, MySQL оптимизирован, чтобы иметь такую ​​же производительность.

С хорошими индексами, например, предложение JOINvs LEFT JOIN+ WHEREдля фильтрации будет то же самое. Оптимизация против человеческого чтения имеет смысл для больших запросов с большим количеством объединений.

Использование хороших индексов и кеша важнее.

Вы можете прочитать хорошее объяснение процесса оптимизации здесь:

Процесс оптимизации запроса : запрос часто может выполняться разными способами и давать один и тот же результат. Задача оптимизатора - найти лучший вариант.

Shim-Сан
источник