SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.11.2011 20:26:22

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

два INNER JOIN по UNION ALL vs один LEFT JOIN

В одной из таблиц есть поле-флаг, в зависимости от которого может потребоваться подключение дополнительной таблицы (и условие по одной из ее колонок).

Т.е.

SELECT ...
FROM t1
LEFT JOIN t2 ON ..
WHERE t1.flag = 0 OR t2.col > 0

vs

SELECT ...
FROM t1
WHERE t1.flag = 0

UNION ALL

SELECT ...
FROM t1
JOIN t2 ON ..
WHERE t1.flag = 1


Какой вариант теоретически будет быстрее работать?

(вообще, если честно, хотелось бы оставить LEFT JOIN, т.к. иначе сильное дублирование - остальные части у них будут идентичны)

Неактивен

 

#2 14.11.2011 16:15:20

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: два INNER JOIN по UNION ALL vs один LEFT JOIN

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

Неактивен

 

#3 14.11.2011 18:36:54

rbwest
Участник
Зарегистрирован: 30.10.2011
Сообщений: 19

Re: два INNER JOIN по UNION ALL vs один LEFT JOIN

Я тут в соседней теме поднимал вопрос, пока не ответили, жду вот. А вообще хочу сказать - если склеивать таблицы в запросе, все более менее работает пока в основной таблице до 100 тысяч строк. Потом начинает жутко тупить, про ORDER BY я вообще молчу. Я пробовал с индексами и так и сяк, прочел кучу инфы в инете - результат если и есть положительный, то он настолько ничтожен что и говорить не хочется - разница в скорости обработки запроса в 0,6 - 0,8 секунды, учитывая что сам запрос с тремя LEFT JOIN и ORDER BY выполняется 43! это ускорение просто незаметно. Тестировал на 560 тысячах строк, правда. Причем и инфы в строках немало. Без ORDER выполняется за 8 секунд, что тоже очень много
Я конешно понимаю что есть решение вопроса, и оно кроется в правильных индексах, но вот знать бы, как правильно сделать...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson