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.