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

Por que o SHOW TABLE STATUS do innodb não é tão confiável?


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.