AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 16656
Accepted
user6845
user6845
Asked: 2012-04-18 18:20:05 +0800 CST2012-04-18 18:20:05 +0800 CST 2012-04-18 18:20:05 +0800 CST

SELECT COUNT GROUP BY é mais eficiente do que contar um conjunto de resultados?

  • 772

Eu tenho uma tabela com uma rankcoluna que pode ser 1, 2ou 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:

  1. Extraia os dados com um normal SELECTe execute uma segunda consulta para obter contagens:

    SELECT rank, COUNT(id) FROM tablename GROUP BY rank
    
  2. 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 COUNTseria um pouco mais lento do que contar (PHP, ASP.NET, Java), em particular se houver mais de 3 valores discretos que eu queira contar.

mysql count
  • 2 2 respostas
  • 28640 Views

2 respostas

  • Voted
  1. Stephen Senkomago Musoke
    2012-04-18T21:26:25+08:002012-04-18T21:26:25+08:00

    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

    SELECT t.rank, col1, col2, rankcount 
    FROM tablename t 
      INNER JOIN 
         (SELECT rank, COUNT(id) as rankcount FROM tablename t2 GROUP BY rank) AS t3 
        ON t.rank = t3.rank  
    ORDER BY t.rank
    
    • 3
  2. Best Answer
    RolandoMySQLDBA
    2012-04-19T04:32:18+08:002012-04-19T04:32:18+08:00

    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:

    SELECT rank, COUNT(id) FROM tablename GROUP BY rank 
    

    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

    SELECT rank, COUNT(1) FROM tablename GROUP BY rank 
    

    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:

    1. uma boa consulta
    2. índices adequados para todas as tabelas na consulta

    Em retrospecto, também é bom dar ao MySQL Query Optimizer o máximo de vantagem possível.

    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve