Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL Performance UNION vs OR


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.