Il s'agit d'une lacune connue de MySQL.
Il est souvent vrai que l'utilisation de UNION
fonctionne mieux qu'une requête de plage comme celle que vous montrez. MySQL n'utilise pas les index très intelligemment pour les expressions utilisant IN (...)
. Un trou similaire existe dans l'optimiseur pour les expressions booléennes avec OR
.
Voir http ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ pour quelques explications et repères détaillés.
L'optimiseur est constamment amélioré. Une lacune dans une version de MySQL peut être corrigée dans une version ultérieure. Il vaut donc la peine de tester vos requêtes sur différentes versions.
Il est également avantageux d'utiliser UNION ALL
au lieu de simplement UNION
. Les deux requêtes utilisent une table temporaire pour stocker les résultats, mais la différence est que UNION
applique DISTINCT
au jeu de résultats, ce qui entraîne un tri non indexé supplémentaire.