Eu tenho uma consulta no mysql da seguinte forma.
SELECT DISTINCT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Agora a execução da consulta leva aproximadamente 13 segundos devido ao tamanho das respectivas tabelas. No entanto, esta consulta é muito mais rápida (ou seja, 2 segundos)
SELECT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Estou ciente de que isso pode resultar em linhas não distintas, mas não tenho certeza se essa situação foi resolvida pelo código php no front-end. Então, na verdade, quero comparar os dados dos dois conjuntos de resultados, ambos resultando em aproximadamente 83.000 linhas, se não forem limitados.
Alguém pode pensar em uma maneira de fazer isso em SQL em vez de fazê-lo por meio de um script php. Eu comparei as primeiras 100 linhas a olho nu sem nenhum problema, mas como todos sabemos, basta uma exceção na 101ª linha para bagunçar tudo. Portanto, preciso de uma consulta que possa executar algumas vezes de vez em quando para ver se há linhas em um conjunto de resultados que não estão no outro.
OK, em primeiro lugar, converse com os desenvolvedores do PHP para ver se esta situação foi resolvida para você, o que evitaria muita dor e sofrimento!
Fora isso, tente com um group by ao invés de um distinto, veja quais são as diferenças de performance - pode ser que o group by seja mais rápido baseado nos índices que você tem nas tabelas.
Com a opção GROUP BY, você pode adicionar uma contagem(*) e conversar com os desenvolvedores do PHP para garantir que eles saibam que, se o resultado for 2 ou mais, eles precisam lidar com isso de maneira diferente do que se o resultado for 1.
Você já tentou substituir o order by por um group by e, em seguida, ter count(*) > 1 instrução. Isso deve mostrar se há linhas duplicadas
Faça uma contagem selecionada de cada consulta e compare?
Você pode colocar ORDER BY dentro de uma consulta separada e usar INNER JOIN para obter o restante das colunas necessárias.
Também coloque um índice em (column_to_distinct,primary_key, colA) na tabela1 e colA na tabela2 para permitir que o MySQL faça uma varredura de índice.
Colocar ORDER BY dentro de um INNER JOIN permite que o MySQL execute a classificação mais rapidamente porque há menos colunas para classificar.
Você precisará de um índice em
tableB
.colA
Além disso, é mais eficiente ter
(já que
tableA
.ColC
é o mesmo quetableB
.ColA
) e um índice na tabela A em ColA,ColC.A diferença entre suas duas consultas não deve ser grande, desde que você continue selecionando um pequeno número de artigos (20 no seu caso) e comece perto do início (suponho que você tenha páginas).
Outra sugestão seria tentar construir um índice na tabelaB, com todas as colunas selecionadas na cláusula distinta.
Implementar a cláusula "distinta" no cliente é muito difícil, desde que você trabalhe com páginas (registros distintos 1-20, registros distintos 21-40, etc). O programa se tornará complicado desnecessariamente.