Подтвердить что ты не робот

Предложение MySQL Присоединиться к предложению WHERE

Какая разница в статье сделала два следующих способа?

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2 AND
    table2.member_id = 4
)

Я сравнил их как с базовыми запросами, так и с EXPLAIN EXTENDED и не вижу разницы. Мне интересно, если кто-то здесь обнаружил разницу в более сложном/интенсивном процессе обработки.

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2
)
WHERE table2.member_id = 4
4b9b3361

Ответ 1

При соединении INNER оба подхода дают одинаковые результаты и должны давать один и тот же план запроса.

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

Обратите внимание, что может быть разница, если вы используете внешнее соединение вместо внутреннего соединения. Например, если вы измените INNER на LEFT и условие соединения завершится неудачно, вы все равно получите строку, если вы использовали первый метод, но он будет отфильтрован, если вы использовали второй метод (поскольку NULL не равен 4).

Ответ 2

Если вы пытаетесь оптимизировать и знать свои данные, добавив предложение "STRAIGHT_JOIN", вы можете значительно повысить производительность. У вас есть внутреннее соединение ON... Итак, просто для подтверждения, вам нужны только записи, в которых объединены таблицы 1 и таблица2, но только для идентификатора члена 2 таблицы = какое-то значение.. в этом случае 4.

Я бы изменил запрос, чтобы таблица 2 была в качестве первичной таблицы выбора, поскольку она имеет явный "member_id", который может быть оптимизирован индексом для ограничения строк, а затем присоединение к таблице 1, например

select STRAIGHT_JOIN
      t1.*
   from
      table2 t2,
      table1 t1
   where 
         t2.member_id = 4
      and t2.col1 = t1.col2

Таким образом, запрос будет предварительно квалифицировать только записи member_id = 4, а затем сопоставление между таблицами 1 и 2. Таким образом, если в таблице 2 было 50 000 записей, а в таблице 1 было 400 000 записей, сначала будет обрабатываться первая таблица2. Ограничение ID = 4 еще меньше и даже меньше при соединении с таблицей 1.

Я знаю, что straight_join работает так, как я его много раз реализовал, имея дело с данными из более чем 14 миллионов записей, ссылающихся на более 15 таблиц поиска, где двигатель запутался, пытаясь задуматься обо мне в критической таблице, Один из таких запросов занимал 24 часа до того, как он висел... Добавляя "STRAIGHT_JOIN" и определяя приоритетность того, что "первичная" таблица находилась в запросе, опустили ее до конечного правильного результата, установленного менее чем за 2 часа.

Ответ 3

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

Ответ 4

С внутренним соединением он практически не отличается; если вы переключитесь на внешнее соединение, все различия в мире.

* Я говорю "почти", потому что оптимизаторы - изворотливые звери, и не исключено, что при некоторых обстоятельствах это может улучшить работу над первым или последним. Не пытайтесь воспользоваться этим поведением.