我目前正在从Server迁移到MySQL。当我试图匹配行数时,我会查询information_Schema.tables。我注意到迁移的信息和源信息之间有一些不同。
但是,我做了一个select count(*) from table;,给出了正确的行数
为什么information_Schema.tables.table_rows和select count(*) from table有区别?
发布于 2015-07-16 20:48:32
根本原因是存储引擎。InnoDB不更新information_schema.tables.table_rows列。
我有一些旧的帖子进一步解释了这一点
Apr 23, 2012:为什么二级索引被选中而不是用于选择计数的聚集索引(*)May 16, 2012:为什么InnoDB不存储行数?Mar 03, 2014:获取mysql表中总条目的最有效方法您可以使用SHOW INDEXES FROM对表进行近似。
如果您希望计算当前数据库中的所有表,而不管存储引擎是什么,只需运行以下命令:
SET group_concat_max_len = 1024*1024*1024;
SELECT GROUP_CONCAT(sqltocount SEPARATOR ' UNION ') sqlcount INTO @sql
FROM (SELECT CONCAT('SELECT ''',table_name,''' tablename,COUNT(1) RowCount
FROM ',table_name) sqltocount FROM (SELECT table_name FROM
information_schema.tables WHERE table_schema=DATABASE()) AA) A;
SELECT @sql\G PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;发布于 2015-07-17 23:29:06
多亏了罗兰多,他的答案很好。我还创建了一个存储过程来获取该信息,如果它对某人有用,我将将其发布:
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');
https://dba.stackexchange.com/questions/107247
复制相似问题