OR, как и UNION DISTINCT, плохо работает при большом перекрытии данных.
Скажем, у вас в таблице миллион строк. По первому условию выбралось полмиллиона, по второму ещё полмиллиона. Если взять OR, то сколько уникальных строк должно быть в результате? Вот на выборке только уникальных строк и идут тормоза.
Быстро работает UNION ALL, но он не удаляет дубли строк.