Dit is een bekende tekortkoming in MySQL.
Het is vaak waar dat het gebruik van UNION
presteert beter dan een bereikquery zoals degene die u laat zien. MySQL gebruikt indexen niet erg intelligent voor uitdrukkingen die IN (...)
gebruiken . Een soortgelijk gat bestaat in de optimalisatie voor booleaanse uitdrukkingen met OR
.
Zie http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ voor wat uitleg en gedetailleerde benchmarks.
De optimizer wordt voortdurend verbeterd. Een tekortkoming in de ene versie van MySQL kan in een volgende versie worden verbeterd. Het is dus de moeite waard om uw zoekopdrachten op verschillende versies te testen.
Het is ook voordelig om UNION ALL
. te gebruiken in plaats van gewoon UNION
. Beide query's gebruiken een tijdelijke tabel om resultaten op te slaan, maar het verschil is dat UNION
geldt DISTINCT
naar de resultatenset, wat een extra niet-geïndexeerde sortering met zich meebrengt.