Detta är en känd brist i MySQL.
Det är ofta sant att använda UNION presterar bättre än en intervallfråga som den du visar. MySQL använder inte index särskilt intelligent för uttryck som använder IN (...) . Ett liknande hål finns i optimeraren för booleska uttryck med OR .
Se http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ för lite förklaring och detaljerade riktmärken.
Optimizern förbättras hela tiden. En brist i en version av MySQL kan förbättras i en efterföljande version. Så det är värt att testa dina frågor på olika versioner.
Det är också fördelaktigt att använda UNION ALL istället för bara UNION . Båda frågorna använder en temporär tabell för att lagra resultat, men skillnaden är att UNION tillämpar DISTINCT till resultatuppsättningen, vilket medför en extra oindexerad sortering.