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

Por que a contagem de linhas estimadas é muito diferente nos resultados do phpmyadmin?


Ao contrário das tabelas MyISAM, as tabelas InnoDB não registram quantas linhas a tabela contém.

Por causa disso, a única maneira de saber o número exato de linhas em uma tabela InnoDB é inspecionar cada linha na tabela e acumular uma contagem. Portanto, em grandes tabelas InnoDB, executando um SELECT COUNT(*) FROM innodb_table A consulta pode ser muito lenta porque faz uma varredura completa da tabela para obter o número de linhas.

phpMyAdmin usa uma consulta como SHOW TABLE STATUS para obter uma contagem estimada do número de linhas na tabela do mecanismo (InnoDB). Como é apenas uma estimativa, varia cada vez que você a chama, às vezes as variações podem ser bastante grandes e às vezes são próximas.

Aqui está uma postagem de blog informativa sobre COUNT(*) for Tabelas InnoDB por Percona.

A página de manual do MySQL para SHOW TABLE STATUS afirma:

O número de linhas. Alguns mecanismos de armazenamento, como MyISAM, armazenam a contagem exata. Para outros mecanismos de armazenamento, como o InnoDB, esse valor é uma aproximação e pode variar do valor real em até 40 a 50%. Nesses casos, use SELECT COUNT(*) para obter uma contagem precisa.

A página sobre restrições do InnoDB entra em mais detalhes:

SHOW TABLE STATUS não fornece estatísticas precisas sobre tabelas InnoDB, exceto para o tamanho físico reservado pela tabela. A contagem de linhas é apenas uma estimativa aproximada usada na otimização SQL.

O InnoDB não mantém uma contagem interna de linhas em uma tabela porque transações simultâneas podem “ver” diferentes números de linhas ao mesmo tempo. Para processar um SELECT COUNT(*) FROM t instrução, InnoDB scansan índice da tabela, que leva algum tempo se o índice não estiver totalmente no buffer pool. Se sua tabela não muda com frequência, usar o cache de consulta do MySQL é uma boa solução. Para obter uma contagem rápida, você deve usar uma tabela de contagem que você mesmo criou e deixar seu aplicativo atualizá-la de acordo com as inserções e exclusões que faz. Se uma contagem aproximada de linhas for suficiente, SHOW TABLE STATUS pode ser usado.Consulte a Seção 14.3.14.1, “Desempenho do InnoDB Dicas de ajuste” .