Исполнители вложенных запросов - PullRequest
0 голосов
/ 30 января 2012

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

select ? from ? where ? = select ? from ?

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

Спасибо за ответы.

С наилучшими пожеланиями.

Ответы [ 5 ]

1 голос
/ 30 января 2012

Это зависит от регистра.В случае, если у вас очень низкий результат во внутреннем запросе, вы должны пойти на него.Поток работает таким образом, что во внутреннем запросе выполняется первым, а результирующий набор используется во внешнем запросе.Между тем, соединения дают вам декартово произведение, которое снова является тяжелой операцией.

1 голос
/ 30 января 2012

Вы должны проверить это. Эти вещи во многом зависят от деталей запроса и используемых им индексов.

По моему опыту, СОЕДИНЕНИЯ, как правило, быстрее, чем вложенные запросы в MySQL. В некоторых случаях MySQL не очень умен и, похоже, запускает подзапрос для каждой строки, созданной внешним запросом.

Подробнее об этих вещах вы можете прочитать в официальной документации:

Оптимизация подзапросов: http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html
Переписать подзапросы как объединения: http://dev.mysql.com/doc/refman/5.6/en/rewriting-subqueries.html

0 голосов
/ 24 февраля 2014

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

Поэтому несколько дней назад я писал запрос для 3-4 таблиц, в которыхогромное количество данных.Я написал большой SQL-запрос с объединениями, и его выполнение заняло около 2-3 часов.Затем я реструктурировал его, создал вложенный запрос выбора, поместил столько вложенных ограничений, сколько смогу, во вложенный и сделал его как можно более строгим, а затем производительность улучшилась на> 90%, теперь для его выполнения требуется менее 4 минут.

Это всего лишь мой опыт и, возможно, теоретически соединения лучше.Я просто хотел поделиться своим опытом.Лучше всего попробовать разные вещи, получить дополнительные знания о таблицах, их индексах и т. Д.

Обновление:

И я только что узнал, что я на самом деле предложил на этой справочной странице по оптимизации MySQL.http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html

Вставка здесь для быстрого ознакомления:

Заменить объединение подзапросом.Например, попробуйте следующее:

SELECT DISTINCT column1 FROM t1, ГДЕ t1.column1 IN (SELECT column1 FROM t2);

Вместо этого:

ВЫБРАТЬ ОТЛИЧИЕ t1.column1 ОТ t1, t2 ГДЕ t1.column1 = t2.column1;

Перемещение предложений снаружи внутрь подзапроса. Например, используйте этот запрос:

SELECT * ОТ t1, ГДЕ s1 IN (ВЫБРАТЬ s1 ИЗ t1 СОЮЗ ВСЕ ВЫБРАТЬ s1ОТ Т2);Вместо этого запроса:

SELECT * ОТ t1, ГДЕ s1 IN (ВЫБЕРИТЕ s1 ОТ t1) ИЛИ s1 IN (ВЫБЕРИТЕ s1 ОТ t2);Для другого примера используйте этот запрос:

SELECT (SELECT column1 + 5 FROM t1) FROM t2;Вместо этого запроса:

SELECT (SELECT column1 FROM t1) + 5 FROM t2;

0 голосов
/ 30 января 2012

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

0 голосов
/ 30 января 2012

Как утверждали Митч и Джони, это зависит.Но, как правило, объединение предложит лучшую производительность.Вы пытаетесь избежать выполнения вложенного запроса для каждой строки внешнего запроса.Хороший оптимизатор запросов может сделать это для вас в любом случае, интерпретируя то, что вы пытаетесь сделать, и по сути «исправляя» свою ошибку.Но с подавляющим большинством запросов вы должны писать это как объединение.Таким образом, вы откровенно говорите о том, что вы пытаетесь сделать, и вы полностью понимаете сами, что делается, и какой самый эффективный способ выполнить работу.

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