Mar*_*ark 318 mysql sql rowcount
有没有办法在不运行SELECT count()每个表的情况下获取MySQL数据库中所有表中的行数?
Hat*_*es_ 380
SELECT SUM(TABLE_ROWS)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{your_db}';
Run Code Online (Sandbox Code Playgroud)
但是请注意文档:对于InnoDB表,行计数只是 SQL优化中使用的粗略估计.您需要使用COUNT(*)来获得准确的计数(这更昂贵).
gpo*_*ojd 165
你可以把一些东西和Tables表放在一起.我从来没有这样做过,但看起来它有一个TABLE_ROWS列和一个TABLE NAME列.
要获取每个表的行,您可以使用如下查询:
SELECT table_name, table_rows
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '**YOUR SCHEMA**';
Run Code Online (Sandbox Code Playgroud)
Nat*_*han 107
像@Venkatramanan和其他人一样,我发现INFORMATION_SCHEMA.TABLES不可靠(使用InnoDB,MySQL 5.1.44),每次运行它时都会提供不同的行数,即使在静默表上也是如此.这是一种相对hacky(但灵活/适应性)的生成大型SQL语句的方法,您可以将其粘贴到新查询中,而无需安装Ruby gems和东西.
SELECT CONCAT(
'SELECT "',
table_name,
'" AS table_name, COUNT(*) AS exact_row_count FROM `',
table_schema,
'`.`',
table_name,
'` UNION '
)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = '**my_schema**';
Run Code Online (Sandbox Code Playgroud)
它产生如下输出:
SELECT "func" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.func UNION
SELECT "general_log" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.general_log UNION
SELECT "help_category" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_category UNION
SELECT "help_keyword" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_keyword UNION
SELECT "help_relation" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_relation UNION
SELECT "help_topic" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_topic UNION
SELECT "host" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.host UNION
SELECT "ndb_binlog_index" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.ndb_binlog_index UNION
Run Code Online (Sandbox Code Playgroud)
复制并粘贴除了最后一个UNION以获得良好的输出,如,
+------------------+-----------------+
| table_name | exact_row_count |
+------------------+-----------------+
| func | 0 |
| general_log | 0 |
| help_category | 37 |
| help_keyword | 450 |
| help_relation | 990 |
| help_topic | 504 |
| host | 0 |
| ndb_binlog_index | 0 |
+------------------+-----------------+
8 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
djb*_*ick 33
我跑了:
show table status;
Run Code Online (Sandbox Code Playgroud)
这将为您提供每个表的行数以及一堆其他信息.我曾经使用上面选择的答案,但这更容易.
我不确定这是否适用于所有版本,但我使用的是InnoDB引擎.
Edu*_*omo 12
简单的方法:
SELECT
TABLE_NAME, SUM(TABLE_ROWS)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{Your_DB}'
GROUP BY TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)
结果示例:
+----------------+-----------------+
| TABLE_NAME | SUM(TABLE_ROWS) |
+----------------+-----------------+
| calls | 7533 |
| courses | 179 |
| course_modules | 298 |
| departments | 58 |
| faculties | 236 |
| modules | 169 |
| searches | 25423 |
| sections | 532 |
| universities | 57 |
| users | 10293 |
+----------------+-----------------+
Run Code Online (Sandbox Code Playgroud)
小智 11
SELECT TABLE_NAME,SUM(TABLE_ROWS)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_db'
GROUP BY TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的.
小智 10
此存储过程列出表,计算记录,并在最后生成记录总数.
要在添加此过程后运行它:
CALL `COUNT_ALL_RECORDS_BY_TABLE` ();
Run Code Online (Sandbox Code Playgroud)
-
程序,流程:
DELIMITER $$
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `COUNT_ALL_RECORDS_BY_TABLE`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE TNAME CHAR(255);
DECLARE table_names CURSOR for
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN table_names;
DROP TABLE IF EXISTS TCOUNTS;
CREATE TEMPORARY TABLE TCOUNTS
(
TABLE_NAME CHAR(255),
RECORD_COUNT INT
) ENGINE = MEMORY;
WHILE done = 0 DO
FETCH NEXT FROM table_names INTO TNAME;
IF done = 0 THEN
SET @SQL_TXT = CONCAT("INSERT INTO TCOUNTS(SELECT '" , TNAME , "' AS TABLE_NAME, COUNT(*) AS RECORD_COUNT FROM ", TNAME, ")");
PREPARE stmt_name FROM @SQL_TXT;
EXECUTE stmt_name;
DEALLOCATE PREPARE stmt_name;
END IF;
END WHILE;
CLOSE table_names;
SELECT * FROM TCOUNTS;
SELECT SUM(RECORD_COUNT) AS TOTAL_DATABASE_RECORD_CT FROM TCOUNTS;
END
Run Code Online (Sandbox Code Playgroud)
这个估计问题有一些技巧/解决方法。
Auto_Increment - 出于某种原因,如果您在表上设置了自动增量,则会为您的数据库返回更准确的行数。
在探索为什么显示表信息与实际数据不匹配时发现了这一点。
SELECT
table_schema 'Database',
SUM(data_length + index_length) AS 'DBSize',
SUM(TABLE_ROWS) AS DBRows,
SUM(AUTO_INCREMENT) AS DBAutoIncCount
FROM information_schema.tables
GROUP BY table_schema;
+--------------------+-----------+---------+----------------+
| Database | DBSize | DBRows | DBAutoIncCount |
+--------------------+-----------+---------+----------------+
| Core | 35241984 | 76057 | 8341 |
| information_schema | 163840 | NULL | NULL |
| jspServ | 49152 | 11 | 856 |
| mysql | 7069265 | 30023 | 1 |
| net_snmp | 47415296 | 95123 | 324 |
| performance_schema | 0 | 1395326 | NULL |
| sys | 16384 | 6 | NULL |
| WebCal | 655360 | 2809 | NULL |
| WxObs | 494256128 | 530533 | 3066752 |
+--------------------+-----------+---------+----------------+
9 rows in set (0.40 sec)
Run Code Online (Sandbox Code Playgroud)
然后,您可以轻松地使用 PHP 或其他任何东西来返回 2 个数据列的最大值,以给出行数的“最佳估计”。
IE
SELECT
table_schema 'Database',
SUM(data_length + index_length) AS 'DBSize',
GREATEST(SUM(TABLE_ROWS), SUM(AUTO_INCREMENT)) AS DBRows
FROM information_schema.tables
GROUP BY table_schema;
Run Code Online (Sandbox Code Playgroud)
Auto Increment 将始终关闭 +1 *(表计数)行,但即使有 4,000 个表和 300 万行,准确率仍为 99.9%。比估计的行好得多。
这样做的好处是,在 performance_schema 中返回的行数也会为您删除,因为 best 不适用于空值。但是,如果您没有带有自动增量的表,这可能是一个问题。