Това е известен недостатък в 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
към резултантния набор, което води до допълнително неиндексирано сортиране.