Eu tenho uma tabela com uma rank
coluna que pode ser 1
, 2
ou 3
. Preciso contar o número de registros para cada classificação, mas também preciso exibir todos os dados ordenados por classificação.
Do meu ponto de vista, as duas maneiras de conseguir isso seriam:
Extraia os dados com um normal
SELECT
e execute uma segunda consulta para obter contagens:SELECT rank, COUNT(id) FROM tablename GROUP BY rank
- Extraia os dados com um SELECT normal e, em seguida, itere duas vezes sobre o conjunto de resultados que recebo: uma vez para contar as ocorrências de cada classificação e a segunda vez para exibir os dados.
Qual caminho seria mais eficiente? Depende do tamanho da mesa? Imagino que para tabelas grandes SELECT COUNT
seria um pouco mais lento do que contar (PHP, ASP.NET, Java), em particular se houver mais de 3 valores discretos que eu queira contar.
A abordagem recomendada para melhorar o desempenho é:
a) Use o banco de dados para fazer o trabalho pesado de contagem, cálculos (quando possível)
b) Reduzir o número de viagens ao banco de dados e a quantidade de dados trazidos de volta em cada viagem
Nesse sentido, não tenho certeza para o que você deseja usar a contagem de classificação, mas a consulta abaixo retornará os dados ordenados por classificação, mas uma coluna "repetida" com o número de registros para cada classificação também será incluída
A resposta depende muito de quão bem organizados são seus dados e da própria consulta.
Por exemplo, veja a consulta que você tem na pergunta:
A primeira coisa que penso com esta consulta é se a tabela está indexada corretamente.
OBSERVAÇÃO #1
Se tablename não tivesse índices, uma varredura completa da tabela seria necessária.
OBSERVAÇÃO #2
Se tablename tiver um índice na classificação, você ainda obterá uma verificação completa da tabela devido ao MySQL Query Optimizer excluir o uso do índice devido a fatores como distribuição de chaves e a possibilidade de pesquisar cada id para cada classificação durante uma varredura de índice.
OBSERVAÇÃO #3
Se a tabela tiver um índice composto de (rank,id), você poderá fazer uma varredura completa do índice. Na maioria dos casos, uma verificação completa do índice que nunca faz referência à tabela para colunas não indexadas seria mais rápida do que uma verificação completa do índice que o faz (consulte a OBSERVAÇÃO #2)
OBSERVAÇÃO #4
Se a consulta foi escrita um pouco diferente
então um índice apenas na coluna de classificação seria suficiente e produziria uma varredura completa do índice.
CONCLUSÃO
À luz dessas observações, é definitivamente uma beleza apresentar ao MySQL Query Optimizer duas coisas:
Em retrospecto, também é bom dar ao MySQL Query Optimizer o máximo de vantagem possível.