Atualmente estou migrando do SQL Server para o MySQL. Quando tento corresponder ao número de linhas, consulto information_Schema.tables. Percebi que existem algumas diferenças entre as informações migradas e as informações de origem.
No entanto, eu fiz um select count(*) from table;
me deu o número correto de linhas
Por que há uma diferença entre the information_Schema.tables.table_rows
e the select count(*) from table
?
A causa raiz é o mecanismo de armazenamento. InnoDB não atualiza a
information_schema.tables.table_rows
coluna.Tenho postagens antigas que explicam isso melhor
Apr 23, 2012
: Por que um índice secundário é escolhido em vez de um índice clusterizado para SELECT COUNT(*) ...?May 16, 2012
: Por que o InnoDB não armazena a contagem de linhas?Mar 03, 2014
: O método mais eficiente para obter o total de entradas em uma tabela mysqlVocê pode obter uma aproximação usando
SHOW INDEXES FROM
a tabelaSe você quiser contar todas as tabelas em seu banco de dados atual, independentemente do mecanismo de armazenamento, execute o seguinte:
DE UMA CHANCE !!!
Graças a Rolando, sua resposta funciona bem. Também criei um procedimento armazenado para obter essas informações, postarei se for útil para alguém:
DROP PROCEDURE IF EXISTS mysql.getRowCount; DELIMITER // CREATE PROCEDURE mysql.getRowCount(DBNAME VARCHAR(30)) BEGIN DECLARE NO_DATA int default 0; DECLARE TBNAME varchar(30); DECLARE TBS CURSOR FOR select table_name from information_schema.tables where table_schema=DBNAME; DECLARE CONTINUE HANDLER FOR NOT FOUND SET NO_DATA=1; OPEN TBS; CREATE TEMPORARY TABLE IF NOT EXISTS table_count (table_schema varchar(30),table_name varchar(30),table_count varchar(11)) ENGINE=MEMORY; tbs:LOOP FETCH TBS into TBNAME; IF NO_DATA=1 THEN LEAVE tbs; END IF; SET @query=concat('SELECT count(*) into @CONT from ',DBNAME,'.',TBNAME,';'); PREPARE test FROM @query; EXECUTE test; DEALLOCATE PREPARE test; SET @query=concat('INSERT into table_count values ("',DBNAME,'","',TBNAME,'","',@CONT,'");'); PREPARE test FROM @query; EXECUTE test; DEALLOCATE PREPARE test; END LOOP tbs; CLOSE TBS; SELECT * from table_count; DROP TABLE table_count; END// DELIMITER ; call mysql.getRowCount('mysql');