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

mysql:escolhendo a consulta mais eficiente das duas


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);