Questa è una carenza nota in MySQL.
È spesso vero che usando UNION
funziona meglio di una query di intervallo come quella mostrata. MySQL non utilizza gli indici in modo molto intelligente per le espressioni che utilizzano IN (...)
. Esiste un buco simile nell'ottimizzatore per le espressioni booleane con OR
.
Vedi http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ per alcune spiegazioni e benchmark dettagliati.
L'ottimizzatore viene continuamente migliorato. Una carenza in una versione di MySQL può essere migliorata in una versione successiva. Quindi vale la pena testare le tue query su versioni diverse.
È anche vantaggioso utilizzare UNION ALL
invece di semplicemente UNION
. Entrambe le query utilizzano una tabella temporanea per memorizzare i risultati, ma la differenza è che UNION
applica DISTINCT
al set di risultati, che comporta un ulteriore ordinamento non indicizzato.