【问题标题】:Exact count of all rows in MySQL database [duplicate]MySQL数据库中所有行的精确计数[重复]
【发布时间】:2012-06-10 09:05:42
【问题描述】:

我目前正在使用脚本

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tables';

但是,它并不准确,因为我的 MySQL 表使用的引擎是 InnoDB(我现在才意识到这可能是一个问题,因为这些数据库已经存在了一段时间)。

有没有什么方法可以用 MySQL 获得数据库每个表中每一行的准确计数?

干杯。

【问题讨论】:

标签: mysql sql database innodb


【解决方案1】:

我认为唯一准确(且速度较慢)的方法是对每个表都这样做:

SELECT COUNT(*) FROM Table

【讨论】:

  • @vearutop Dragon Jake 在他/她的回答中提到这需要在每张桌子上运行......
  • 我不会将所有内容都放在 SQL 查询中,似乎 MySQL 无法从变量表名中进行选择。所以我至少想出了查询生成器:SELECT CONCAT('SELECT COUNT(*) FROM ', table_name) FROM information_schema.tables WHERE table_schema = 'Tables';
  • 干杯@DragonJake,原来这就是我必须做的。 :)
【解决方案2】:

这对我有用

    <?php 

             mysql_connect("localhost", "root", "pass") or die(mysql_error());

             mysql_select_db("csl") or die(mysql_error());

             $dtb=mysql_query("SHOW TABLES") or die (mysql_error()); 

             $jmltbl=0; $jml_record=0; $jml_record=0; $total =0;


             while($row=mysql_fetch_array($dtb)) 

    { 

 $sql=mysql_query("select * from $row[0]");

 $jml_record=mysql_num_rows($sql);

 $total += $jml_record;   // this counts all the rows





 $jmltbl++; $jml_record+=$jml_record;




    } 
      // echo"--------$jmltbl Tables, $jml_record records."; // will print count of indivual table

echo $total;  // this will print you count of all rows in MySQL database 

       ?>

我已经测试了这段代码及其工作

为我输出 1145

【讨论】:

  • 对我来说并不慢,它立即数 1145 所有其他与架构相关的扫描仪对我不起作用,他们只是给出了空结果
  • -1 用于返回整个数据库中所有表的所有行。使用count(*) 而不是*
【解决方案3】:

Select Sum(column_Name) from table,不能给出一个表中行的准确计数,它会给出总行数+1,也会给出下一个数据插入行。还有一件事是,在sum(Column_Name) 中, column_Name 应该是 int ,如果它是 varchar 或 char sum 函数将不起作用。所以最好的事情是使用 Select Count(*) from table 获取表中的确切行数。

ThnQ,

文卡特

【讨论】:

    【解决方案4】:

    这条SQL语句会生成一个联合查询,可以一步完成任务:

    SELECT CONCAT('SELECT \'', table_name ,'\' as tbl, (SELECT COUNT(*) FROM ', table_name, ') AS ct UNION')
    FROM information_schema.tables
    WHERE table_schema = 'your_database';
    

    运行 SQL 语句后,只需将输出粘贴到文本编辑器中,从输出末尾删除单词“UNION”,即可得到联合查询。

    请注意,运行联合查询可能会占用大量资源,具体取决于您的数据库大小、负载和硬件,因此您可能不想一次全部运行。

    【讨论】:

      【解决方案5】:
      select table_name,table_rows from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='database name';
      

      table_name 表示“数据库”中存在的表数

      table_rows 表示每列的行数

      table_schema 是数据库名称。您要从哪个数据库中查找计数

      【讨论】:

      • INFORMATION_SCHEMA 中的 table_rows 计数对于 Innodb 表并不准确,它只是一个近似值。
      • 同意。这适用于非 InnoDB 表,但不能解决特定问题。
      【解决方案6】:

      我遇到了同样的问题,导致我提出这个问题。

      感谢 computerGuy12345 的回答,我想出了一个存储过程 无需复制粘贴即可执行此操作。 正如他所说,请注意这将扫描每个表并且可能需要一段时间。

      DELIMITER $$
      
      CREATE PROCEDURE `all_tables_rowcount`(databaseName VARCHAR(250))
      BEGIN
      DECLARE p_done INT DEFAULT FALSE;
      DECLARE p_queryString varchar(250) ;
      DECLARE p_cur CURSOR FOR SELECT queryString FROM tmp.tableCountQueries;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done = TRUE;
      
      DROP TEMPORARY TABLE IF EXISTS tmp.tableCountQueries;
      DROP TEMPORARY TABLE IF EXISTS tmp.tableCounts;
      
      CREATE TEMPORARY TABLE tmp.tableCounts(TableName varchar(250), RowCount BIGINT) ;
      
      CREATE TEMPORARY TABLE tmp.tableCountQueries(queryString varchar(250)) AS 
      (
          SELECT CONCAT(
              'INSERT INTO tmp.tableCounts(TableName, RowCount) SELECT "', 
              table_name, 
              '", COUNT(*) AS RowCount FROM ', 
              table_schema,
              '.',
              table_name
          ) AS queryString
          FROM INFORMATION_SCHEMA.TABLES 
          WHERE table_schema = databaseName
      ) ;
      
      OPEN p_cur;
      
      read_loop: LOOP
          FETCH p_cur INTO p_queryString;
          IF p_done THEN
            LEAVE read_loop;
          END IF;
          SET @queryString = p_queryString ;
          PREPARE rowcountTable FROM @queryString; 
          EXECUTE rowcountTable ;
      END LOOP;
      
      SELECT * FROM tmp.tableCounts ;
      END
      

      【讨论】:

      • 这很有帮助。谢谢!
      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多