#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. Большое вам спасибо. Это был ответ, который я искал.