2017-02-13 2 views
0

В проекте есть бизнес-требования, относящиеся к нескольким таблицам. Следующие два варианта запроса полезны для оптимизации производительности в этих случаях. Как выбрать? Первое: Фильтр декартово произведение:Другая эффективность SQL-запросов

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

Второй: левый режим внешнего соединения или правый режим внешнего соединения

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

Пожалуйста, скажите мне. Большое спасибо.

+0

Я не понимаю вопрос. Не могли бы вы рассказать? – 0xCAFEBABE

+0

Эти два не эквивалентны. 'LEFT JOIN' вернет строки' table1', которые не имеют соответствующей строки 'table2', декартово произведение не вернет эти строки. – Barmar

+0

@ 0xCAFEBABE Используйте приведенные выше два способа запроса одних и тех же данных, но я хотел бы знать, в каком случае использование этого способа будет лучше. – lpgad

ответ

0

Если вы пишете их в форме, где они дают одинаковые результаты, ожидайте, что анализатор запросов даст вам одинаковые * планы запросов. Это говорит Использование РЕГИСТРИРУЙТЕСЬ не ,, потому что , гораздо менее ясно, и устарел в течение десятилетий

Если вы хотите сравнить производительность двух различных запросов, самый простой способ запустить как и сравнить, как долго они (EXPLAIN query text here в mysql предложит вам план запроса)

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

I.e.

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

имеет такое же значение, как

select table1.a ,table2.b from table1 join table2 on table1.id=table2.id 

и

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

имеет тот же смысл,

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 

и формы, которые вы не использовали присоединиться:

select table1.a ,table2.b from table1 right join table2 on table1.id=table2.id 

имеет такое же значение, как

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 

И

select table1.a ,table2.b from table1 full join table2 on table1.id=table2.id 

имеет такое же значение, как

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 
-2

Второй запрос выполняется быстрее. он не имеет вложенных условий. Обработчик SQL engine рассматривает соединение как отдельную таблицу или представление.

В моем открытии первый запрос работает как «цикл цикла», поэтому сложность времени выполнения - это O (n), а запрос seconf работает как «Дело коммутатора» в сложной среде исполнения Worsecase - это O (log n).

+0

В любом случае второй лучше первого? – lpgad

+0

SQL проходит шаг плана запроса. В двух запросах OP будут аналогичные планы (идентичные, если он изменится на 'join' из' left join') – Caleth

Смежные вопросы