2015-04-30 4 views
-2

У меня есть две таблицы с тем же именем столбца. Я хочу искать в них. Я исследовал и понял, что лучше использовать UNION ALLINNER JOIN (с точки зрения скорости и производительности). Теперь я хочу знать, если результат не найден, UNION ALL еще лучше?внутреннее соединение VS union all, когда результат не найден

Я думаю, что алгоритм JOIN Keyword: если результат не найден в первой таблице, операция останавливается (во второй таблице поиск не будет). Но UNION ALL искать все таблицы в любом случае. Думаю, правильно? Если моя мысль правильная, тогда INNER JOIN лучше, если результат не найден?

пункт: col индексируется (phpmyadmin).

Теперь какой из них имеет лучшую производительность, если результат не найден?

SELECT col FROM table1 WHERE col='test' 
UNION ALL 
SELECT col FROM table2 WHERE col='test'; 

VS

SELECT col 
FROM table1 
INNER JOIN table2 
ON table1.col=table2.col 
WHERE col='test'; 
+0

Измените свой вопрос и добавьте образцы данных и желаемые результаты. Что вы хотите, чтобы запрос возвращался, когда результат не найден? –

+0

Ваш пример INNER JOIN не даст одинаковых результатов, это даст ИНТЕРСИКТ, а не UNION. – MatBailie

ответ

2

UNION ALL, как правило, быстрее. Это не требует сложных поисков. Он просто конкатцирует два запроса. Независимо от того, запрашиваются ли данные из обеих таблиц в случае INNER JOIN, это зависит от базы данных, не говоря уже о конкретных деталях (используемые индексы и т. Д.).

Тем не менее, ваши запросы не совпадают. Версия с UNION ALL вернет две строки, если обе таблицы содержат такую ​​запись и все равно вернут одну строку, если любая таблица содержит совпадение.

Версия с INNER JOINбудет только возвращает строку, если оба таблиц содержат соответствующую запись, и не будет возвращать строку, если только один из них (или ни одного) содержит соответствующую запись.

NB, один с INNER JOIN использует неустановленный столбец col, что, вероятно, приведет к ошибке.

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

Кроме того, будьте осторожны, чтобы вы не оптимизировали неправильную вещь. Даже если версия INNER JOIN будет немного быстрее, когда данные не будут найдены, версия UNION ALL все равно будет молниеносной, так что лучше выбрать более оптимальный вариант для ситуаций, когда у вас есть совпадение.

+0

Я просто добавляю (поскольку @GolezTrol уже ответил), что с помощью 'UNION ALL' единственный путь к' ORDER' - ** в конце ** (после объединения) вопреки 'INNER JOIN' (где вы уже можете заказать свои строки ** перед присоединением **). Лучший ответ будет дан «планом выполнения». – MacKentoch