Jest to znany brak w MySQL.
Często jest prawdą, że użycie UNION działa lepiej niż zapytanie zakresowe, takie jak to, które pokazujesz. MySQL nie używa indeksów bardzo inteligentnie dla wyrażeń używających IN (...) . Podobna dziura istnieje w optymalizatorze dla wyrażeń logicznych z OR .
Zobacz http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ po pewne wyjaśnienia i szczegółowe testy porównawcze.
Optymalizator jest cały czas ulepszany. Braki w jednej wersji MySQL można poprawić w kolejnej wersji. Dlatego warto przetestować swoje zapytania w różnych wersjach.
Korzystne jest również użycie UNION ALL zamiast po prostu UNION . Oba zapytania używają tymczasowej tabeli do przechowywania wyników, ale różnica polega na tym, że UNION stosuje DISTINCT do zestawu wyników, co powoduje dodatkowe sortowanie bez indeksowania.