Ou o artigo que você leu usou um mau exemplo, ou você interpretou mal o ponto deles.
select username from users where company = 'bbc' or company = 'itv';
Isso é equivalente a:
select username from users where company IN ('bbc', 'itv');
MySQL pode usar um índice em
company
para esta consulta muito bem. Não há necessidade de fazer qualquer UNIÃO. O caso mais complicado é quando você tem um
OR
condição que envolve dois diferentes colunas. select username from users where company = 'bbc' or city = 'London';
Suponha que haja um índice em
company
e um índice separado em city
. Dado que o MySQL geralmente usa apenas um índice por tabela em uma determinada consulta, qual índice ele deve usar? Se usar o índice na company
, ainda teria que fazer uma varredura de tabela para encontrar linhas onde city
é Londres. Se usar o índice em city
, teria que fazer uma varredura de tabela para linhas onde company
é bbc. A
UNION
solução é para este tipo de caso. select username from users where company = 'bbc'
union
select username from users where city = 'London';
Agora, cada subconsulta pode usar o índice para sua pesquisa, e os resultados da subconsulta são combinados pelo
UNION
. Um usuário anônimo propôs uma edição à minha resposta acima, mas um moderador rejeitou a edição. Deveria ser um comentário, não uma edição. A alegação da edição proposta foi que UNION precisa classificar o conjunto de resultados para eliminar linhas duplicadas. Isso torna a consulta mais lenta e, portanto, a otimização do índice é uma lavagem.
Minha resposta é que os índices ajudam a reduzir o conjunto de resultados para um pequeno número de linhas antes que o UNION aconteça. O UNION de fato elimina duplicatas, mas para fazer isso ele só precisa ordenar o pequeno conjunto de resultados. Pode haver casos em que as cláusulas WHERE correspondam a uma parte significativa da tabela, e a classificação durante UNION é tão cara quanto simplesmente fazer a varredura da tabela. Mas é mais comum que o conjunto de resultados seja reduzido pelas pesquisas indexadas, portanto, a classificação é muito menos dispendiosa do que a varredura de tabela.
A diferença depende dos dados na tabela e dos termos que estão sendo pesquisados. A única maneira de determinar a melhor solução para uma determinada consulta é tentar os dois métodos em o criador de perfil de consulta do MySQL e comparar seu desempenho.