Лучше ли использовать, где вместо добавления условий в предложение предложения в SQL-запросах?

Привет:) У меня вопрос о MySQL-запросах. Какой из них быстрее и почему? Есть ли вообще разница?

select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk 
WHERE tab2.somevalue = 'value'

Или этот:

select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk 
AND tab2.somevalue = 'value'

Ответ 1

Как отметил Саймон, разница в производительности должна быть незначительной. Основная проблема заключалась в том, чтобы ваш запрос правильно выражал ваши намерения, и (особенно) вы получили ожидаемые результаты.

Как правило, вы хотите добавить фильтры в предложение JOIN только в том случае, если фильтр является условием объединения. В большинстве (не всех) случаях фильтр должен применяться к предложению WHERE, поскольку он является фильтром общего запроса, а не самого соединения.

AFAIK, единственный экземпляр, где это действительно влияет на результат запроса, - это использование OUTER JOIN.

Рассмотрим следующие запросы:

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"

против.

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"

Первый возвращает одну строку для каждого заказа клиента, который имеет тип заказа "Интернет-заказ" . Фактически, ваше левое соединение стало внутренним соединением из-за фильтра, который был применен ко всему запросу (т.е. Клиенты, у которых нет "InternetOrder", вообще не будут возвращены).

Вторая вернет хотя бы одну строку для каждого клиента. Если у клиента нет заказов типа заказа "Интернет-заказ" , он вернет нулевые значения для всех полей таблицы заказов. В противном случае он вернет одну строку для каждого заказа клиента типа "Интернет-заказ" .

Ответ 2

Если ограничение основано на объединенной таблице (как у вас есть), тогда имеет смысл указать ограничение при вступлении.

Таким образом, MySQL может сократить строки из объединенной таблицы в момент ее присоединения, поскольку в противном случае она должна будет иметь возможность выбирать все данные, которые удовлетворяют основным критериям JOIN, до применения логики WHERE.

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