Dies ist ein bekannter Mangel in MySQL.
Es ist oft richtig, dass die Verwendung von UNION
funktioniert besser als eine Bereichsabfrage wie die, die Sie zeigen. MySQL verwendet Indizes nicht sehr intelligent für Ausdrücke, die IN (...)
verwenden . Eine ähnliche Lücke existiert im Optimierer für boolesche Ausdrücke mit OR
.
Siehe http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ für einige Erläuterungen und detaillierte Benchmarks.
Der Optimierer wird ständig verbessert. Ein Mangel in einer Version von MySQL kann in einer nachfolgenden Version behoben werden. Es lohnt sich also, Ihre Abfragen auf verschiedenen Versionen zu testen.
Vorteilhaft ist auch die Verwendung von UNION ALL
statt einfach UNION
. Beide Abfragen verwenden eine temporäre Tabelle zum Speichern der Ergebnisse, aber der Unterschied besteht darin, dass UNION
wendet DISTINCT
an in die Ergebnismenge, was eine zusätzliche nicht indizierte Sortierung nach sich zieht.