Não há dúvida de que a versão 1 - cláusulas where separadas em cada lado da união - será mais rápida. Vejamos por que a versão - cláusula where sobre o resultado da união - é pior:
- volume de dados:sempre haverá mais linhas no resultado da união, porque há menos condições sobre quais linhas são retornadas. Isso significa mais E/S de disco (dependendo dos índices), mais armazenamento temporário para manter o conjunto de linhas, o que significa mais tempo de processamento
- varredura repetida:todo o resultado da união deve ser varrido novamente para aplicar a condição, quando poderia ter sido tratada durante a varredura inicial. Isso significa manipulação dupla do conjunto de linhas, embora provavelmente na memória, ainda é um trabalho extra.
- os índices não são usados para cláusulas where em um resultado de união. Se você tiver um índice sobre os campos de chave estrangeira e postType, não seria usado
Se você deseja desempenho máximo, use
UNION ALL
, que passa as linhas diretamente para o resultado sem sobrecarga, em vez de UNION
, que remove duplicatas (geralmente por classificação) e pode ser caro e desnecessário com base em seus comentários Defina esses índices e use a versão 1 para desempenho máximo:
create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);