Когда использовать JOIN для MySQL (SQL) - PullRequest
3 голосов
/ 22 июля 2011

Я не могу эффективно понять разницу между этими двумя запросами.

select *
from person p, mytlc m
where p.personid = m.personid and p.personid = 3635

select *
from person p
    join mytlc m on p.personid = m.personid
where p.personid=3635

В этом случае я не думаю, что любой из них будет более производительным запросом, но что делать, если запрос был более сложным?намного больше данных.

Спасибо!

Ответы [ 4 ]

5 голосов
/ 22 июля 2011

Если вы хотите найти больше информации по этой теме, вы можете попробовать googling 'join vs where' .Вот пара других вопросов, которые касаются той же вещи:

  1. Внутреннее объединение против Где
  2. MySQL: Внутреннее объединение против Где
  3. http://forums.devx.com/showthread.php?t=19242

Интересна цитата из третьего (относительно SQL Server, но, вероятно, они похожи по поведению):

Еслиизмеряя это, вы, скорее всего, обнаружите, что в двух версиях используется один и тот же план доступа.SQL Server очень старается оптимизировать запрос, и в этом процессе предложение where, которое приравнивает столбцы из двух таблиц, будет преобразовано во внутреннее соединение.

Похоже, что это технически соединениеправильно и более эффективно, чем где, но на практике это не имеет значения, потому что оптимизация, скорее всего, исправит где в объединение.Однако для случаев, когда он не будет оптимизирован, лучше быть явным, и, как указывают другие, join - верный способ сделать это.

4 голосов
/ 22 июля 2011

Это просто два разных способа сказать один и тот же запрос. Первый - это «старый» способ создания соединений и (по моему опыту) менее желателен. Последний является «новым» способом выполнения объединений и является более явным.

Они функционально эквивалентны.

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

Первое, скорее всего, будет иметь ошибку, если у вас много объединений (случайное перекрестное соединение). Первое также может создать проблемы, когда вам нужно перейти на внешнее объединение, поскольку объединение неявных и явных объединений может определенно привести к неверным результатам. Поэтому первое сложнее поддерживать с течением времени. Первое также неясно, когда вы намеревались перекрестное соединение или если это было случайно. Это реальная проблема в обслуживании, поскольку вы можете исправить «ошибку», которая была преднамеренной, или подумать, что что-то было преднамеренным и являлось подлинной ошибкой. Я также обнаружил, что многие люди (не все), которые используют первую форму, неправильно понимают объединения и, следовательно, часто не понимают, получили ли они правильный набор результатов.

Буквально нет причин вообще использовать первую форму (нет выгоды в использовании этой формы и нескольких минусов). Я переписываю его всякий раз, когда вижу, и никогда не пишу новый код, используя его.

0 голосов
/ 22 июля 2011

Есть и другой способ:

выберите * от человека р присоединиться к mytlc m на p.personid = m.personid и p.personid = 3635

Первый подход и описанный выше подход будут иметь одинаковую производительность, только старый и новый способ написания запросов. Написание объединений с ON - это стиль ANSI. Вот и все ...

Теперь вы можете присоединять дополнительные условия либо к предложению where, либо к тому же предложению ON после условия объединения. Здесь отображается производительность и, в зависимости от результатов запроса, решение принято.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...