A documentação oficial do MySQL 5.1 reconhece que o InnoDB não fornece estatísticas precisas com
SHOW TABLE STATUS
. Enquanto as tabelas MYISAM mantêm especificamente um cache interno de metadados, como número de linhas, etc., o mecanismo InnoDB armazena dados e índices da tabela em */var/lib/mysql/ibdata** O InnoDB não possui um arquivo de índice conveniente que permita uma consulta rápida de números de linha.
Números de linha de tabela inconsistentes são relatados por
SHOW TABLE STATUS
porque o InnoDB estima dinamicamente o valor de 'Linhas' por amostragem de um intervalo de dados da tabela (em */var/lib/mysql/ibdata**) e então extrapola o número aproximado de linhas. Tanto que a documentação do InnoDB reconhece a imprecisão do número da linha de até 50% ao usar SHOW TABLE STATUS
A documentação do MySQL sugere o uso do cache de consulta do MySQL para obter consultas de número de linha consistentes, mas os documentos não especificam como . Segue uma explicação sucinta de como isso pode ser feito.
Primeiro, verifique se o cache de consulta está ativado:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Se o valor de have_query_cache é NÃO em seguida, habilite o cache de consulta adicionando as seguintes linhas a /etc/my.cnf e reinicie o mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(para obter mais informações, consulte http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Consulte o conteúdo do cache com
mysql> SHOW STATUS LIKE 'Qcache%';
Agora use o
SQL_CALC_FOUND_ROWS
instrução em um SELECT
inquerir:SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
tentará uma leitura do cache e, se essa consulta não for encontrada, executará a consulta na tabela especificada e, em seguida, confirmará o número de linhas da tabela no cache de consulta. Execuções adicionais da consulta acima (ou outro 'cachável' SELECT
instruções - veja abaixo) consultará o cache e retornará o resultado correto. Subsequente 'cachable'
SELECT
consultas
- mesmo que LIMIT
o resultado - consultará o cache de consulta e permitirá que você obtenha (apenas uma vez) os números totais de linhas da tabela com SELECT FOUND_ROWS();
que retorna o total de linhas da tabela correta da consulta armazenada em cache anterior.