Dette er en kendt mangel i MySQL.
Det er ofte rigtigt at bruge UNION
yder bedre end en intervalforespørgsel som den, du viser. MySQL anvender ikke indekser særlig intelligent til udtryk, der bruger IN (...)
. Et lignende hul findes i optimeringsværktøjet til booleske udtryk med OR
.
Se http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ for nogle forklaringer og detaljerede benchmarks.
Optimizeren bliver hele tiden forbedret. En mangel i én version af MySQL kan blive forbedret i en efterfølgende version. Så det er værd at teste dine forespørgsler på forskellige versioner.
Det er også fordelagtigt at bruge UNION ALL
i stedet for blot UNION
. Begge forespørgsler bruger en midlertidig tabel til at gemme resultater, men forskellen er, at UNION
anvender DISTINCT
til resultatsættet, hvilket medfører en ekstra ikke-indekseret sortering.