Това е известен недостатък в MySQL.
Често е вярно, че се използва UNION работи по-добре от заявка за диапазон като тази, която показвате. MySQL не използва индекси много интелигентно за изрази, използващи IN (...) . Подобна дупка съществува в оптимизатора за булеви изрази с OR .
Вижте http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ за някои обяснения и подробни показатели.
Оптимизаторът непрекъснато се подобрява. Дефицит в една версия на MySQL може да бъде подобрен в следваща версия. Така че си струва да тествате заявките си в различни версии.
Също така е изгодно да използвате UNION ALL вместо просто UNION . И двете заявки използват временна таблица за съхраняване на резултати, но разликата е, че UNION прилага DISTINCT към резултантния набор, което води до допълнително неиндексирано сортиране.