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.