Soit l'article que vous avez lu utilise un mauvais exemple, soit vous avez mal interprété son propos.
select username from users where company = 'bbc' or company = 'itv';
Cela équivaut à :
select username from users where company IN ('bbc', 'itv');
MySQL peut utiliser un index sur company
pour cette requête très bien. Il n'est pas nécessaire de faire une UNION.
Le cas le plus délicat est celui où vous avez un OR
condition qui implique deux différents colonnes.
select username from users where company = 'bbc' or city = 'London';
Supposons qu'il existe un index sur company
et un index séparé sur city
. Étant donné que MySQL n'utilise généralement qu'un seul index par table dans une requête donnée, quel index doit-il utiliser ? S'il utilise l'index sur company
, il faudrait encore faire un balayage de table pour trouver les lignes où city
est Londres. S'il utilise l'index sur city
, il devrait effectuer une analyse de table pour les lignes où company
est bbc.
L'UNION
solution est pour ce type de cas.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Désormais, chaque sous-requête peut utiliser l'index pour sa recherche, et les résultats de la sous-requête sont combinés par l'UNION
.
Un utilisateur anonyme a proposé une modification à ma réponse ci-dessus, mais un modérateur a rejeté la modification. Cela aurait dû être un commentaire, pas une modification. L'affirmation de la modification proposée était que UNION devait trier le jeu de résultats pour éliminer les lignes en double. Cela ralentit l'exécution de la requête et l'optimisation de l'index est donc un lavage.
Ma réponse est que les index aident à réduire le jeu de résultats à un petit nombre de lignes avant que l'UNION ne se produise. UNION élimine en fait les doublons, mais pour ce faire, il n'a qu'à trier le petit ensemble de résultats. Il peut y avoir des cas où les clauses WHERE correspondent à une partie importante de la table, et le tri pendant UNION est aussi coûteux que le simple balayage de la table. Mais il est plus courant que le jeu de résultats soit réduit par les recherches indexées, de sorte que le tri est beaucoup moins coûteux que le balayage de table.
La différence dépend des données du tableau et des termes recherchés. La seule façon de déterminer la meilleure solution pour une requête donnée est d'essayer les deux méthodes dans le profileur de requête MySQL et comparer leurs performances.