Почему OR
такой медленный, а UNION
такой быстрый?
Вы понимаете, почему UNION
быстрый? Поскольку он может использовать два отдельных индекса с хорошим преимуществом и собирать несколько строк результатов из каждой части UNION
, затем объединить результаты вместе.
Но почему OR
не может этого сделать? Проще говоря, Оптимизатор не достаточно умен, чтобы попробовать этот угол.
В вашем случае тесты проводятся на разных таблицах; это приводит к радикально разным планам запросов (см. EXPLAIN SELECT ...
) для двух частей UNION
. Каждый может быть хорошо оптимизирован, поэтому каждый работает быстро.
Предполагая, что каждая часть доставляет только несколько строк, последующие издержки UNION
незначительны, а именно - собрать два небольших набора строк, дедуплировать их (если вы используете UNION DISTINCT
вместо UNION ALL
), и доставить результаты.
Между тем, запрос OR
эффективно собирает все комбинации двух таблиц, и отфильтровываются на основе двух частей OR
. Промежуточная стадия может включать в себя огромную временную таблицу только для того, чтобы отбрасывать большинство строк.
(Еще один пример inflate-deflate - JOINs
+ GROUP BY
. Обходные пути разные.)