LEFT JOIN или просто выбрать дополнительные таблицы? - PullRequest
0 голосов
/ 28 октября 2011

Я задаюсь вопросом о скорости между явным произнесением LEFT JOIN и простым соединением значений друг с другом.Итак, у нас есть:

SELECT example.id FROM example
LEFT JOIN finals ON example.id = finals.account_id";

против

SELECT example.id, finals.account_id
FROM example, finals
WHERE example.id = finals.account_id

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

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

Второе значение равно INNER JOIN (по умолчанию), и речь идет не столько о скорости, сколько о выходе - внутреннее объединение будет возвращаться только в том случае, если указанное поле существует в обеих таблицах.

например, если былоexample запись # 3, но нет finals записи с account_id из 3, ни одна запись не будет показана

A LEFT JOIN будет перечислять записи из example даже там, где нет соответствия finalsзапись - пропущенные поля будут установлены в NULL

2 голосов
/ 28 октября 2011

Между этими запросами есть семантическая разница.

Первое соединение - это ВНЕШНЕЕ СОЕДИНЕНИЕ, которое включает в себя все строки из левой таблицы. Второе - ВНУТРЕННЕЕ СОЕДИНЕНИЕ и не будет содержать строки, в которых совпадение не удалось.

Если бы вы написали JOIN вместо LEFT JOIN, два запроса были бы идентичны, за исключением того, что первый синтаксис предпочтителен для удобства чтения и поддержки.

На самом деле я даже не знаю, как «позвонить» второму, я просто называю это «мягким соединением»)

Второй синтаксис использует то, что MySQL называет «оператором запятой». Иногда его называют неявное соединение . Это также называется ANSI-89 соединение .

0 голосов
/ 28 октября 2011

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

Во втором запросе используется CROSS JOIN (в отличие от JOIN в mysql .. запятая является псевдонимом для JOIN без предложения ON).

0 голосов
/ 28 октября 2011

Этот второй пример выполняет INNER JOIN и возвращает потенциально разные результаты.

...