Определение правой и левой таблиц в соединениях SQL

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

Я хотел спросить, есть ли способ узнать, какая таблица должна быть правой или левой при использовании объединений в SQL? например, у меня есть две таблицы, к которым я присоединяюсь, например,

 SELECT * FROM filtered_numbers LEFT JOIN telecoms ON filtered_numbers.TelecomID = telecoms.ID
  

Теперь таблица ‘filtered_numbers’ содержит 200 записей, в то время как ‘telecoms’ имеет только 5.
Мой вопрос в том, будет ли разница в производительности / эффективности БД, если я поменяю местами позиции этих двух таблиц в запросе?
Если да, то почему?

Комментарии:

1. Нет. И обратите внимание, что никто никогда не использует RIGHT JOIN.

2. tbl1 LEFT JOIN tbl2 то же tbl2 RIGHT JOIN tbl1 самое, что и .

3. При СОЕДИНЕНИИ СЛЕВА вы получаете все строки из первой таблицы, а во второй таблице могут быть совпадения не для всех. В ПРАВОМ СОЕДИНЕНИИ все наоборот.

4. @Strawberry спасибо за ответ. и это был всего лишь пример, я тоже не использую right join.

5. Существует разница между filtered_numbers RIGHT JOIN telecoms и telecoms RIGHT JOIN filtered_numbers поскольку они дают разные результаты.

Ответ №1:

Этот ответ немного сложен. Первое, что следует отметить, это то, что

 FROM filtered_numbers LEFT JOIN
     telecoms
     ON filtered_numbers.TelecomID = telecoms.ID
  

семантически сильно отличается от:

 FROM telecoms LEFT JOIN
     filtered_numbers
     ON filtered_numbers.TelecomID = telecoms.ID
  

Переключение только таблиц изменяет смысл запроса. План выполнения и производительность будут другими. Вы получите тот же запрос, если LEFT JOIN RIGHT JOIN в этом случае измените значение на a, но, как указывает Strawberry, LEFT JOIN это гораздо предпочтительнее.

Это упрощено, хотя и не всегда верно. Если у вас сложный запрос, порядок JOIN s может иметь значение. Теперь у LEFT JOIN него есть «ведущая» таблица (где хранятся все строки), поэтому вариантов намного меньше. Но если у вас есть INNER JOIN s, тогда порядок может иметь значение.

На самом деле, это может иметь настолько большое значение, что MySQL предлагает подсказки оптимизатора только для управления порядком соединения.

Итак, ответ на ваш вопрос:

  • Переключение таблиц в вашем запросе повлияет на производительность, поскольку значение запроса изменится.
  • Переключение таблиц и переход на a RIGHT JOIN не повлияет на производительность, потому что у оптимизатора действительно есть только один вариант.
  • В более сложных запросах порядок соединений может быть важным.

Комментарии:

1. Большое вам спасибо. Это был ответ, который я искал.