Toto je známý nedostatek v MySQL.
Často platí, že pomocí UNION
funguje lépe než dotaz na rozsah, jako je ten, který zobrazujete. MySQL nepoužívá indexy příliš inteligentně pro výrazy používající IN (...)
. Podobná díra existuje v optimalizátoru pro booleovské výrazy s OR
.
Viz http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ pro nějaké vysvětlení a podrobné srovnávací testy.
Optimalizátor je neustále vylepšován. Nedostatek v jedné verzi MySQL může být vylepšen v následující verzi. Vyplatí se tedy otestovat vaše dotazy na různých verzích.
Výhodné je také použít UNION ALL
místo jednoduše UNION
. Oba dotazy používají k ukládání výsledků dočasnou tabulku, ale rozdíl je v tom, že UNION
platí DISTINCT
na sadu výsledků, což způsobí další neindexované řazení.