【问题标题】:Count table rows计算表格行数
【发布时间】:2010-12-25 23:47:50
【问题描述】:

获取表中记录数的 MySQL 命令是什么?

【问题讨论】:

    标签: mysql


    【解决方案1】:
    SELECT COUNT(*) FROM fooTable;
    

    将统计表格中的行数。

    请参阅reference manual

    【讨论】:

    • 当我使用索引列的名称而不是 * 时会更快吗?像这样:SELECT COUNT(id) FROM tablename
    • 只有一点点。我得到一个 21961904 行表,他的 COUNT 在 115 秒内查询,而使用 ID 需要 107 秒。
    • COUNT(*) 是严格的语言定义。如果你尝试 COUNT (*) 注意空格,你会得到一个解析错误
    • 你可以COUNT(1),这是最快的方式。
    • 在 PHP 中使用 COUNT() 编写变量的最佳方法是什么?我在SQL中做“...COUNT(*) AS rowCount...”,是使用$results->num_rows,还是有办法直接调用这个结果?
    【解决方案2】:

    因为没有人提到它:

    show table status;
    

    列出所有表以及一些附加信息,包括每个表的估计行数。这是 phpMyAdmin 用于其数据库页面的内容。

    此信息在 MySQL 4 中可用,可能在 MySQL 3.23 中也可用 - 长时间先验信息模式数据库。

    更新:

    由于有人反对,我想澄清一下,显示的数字是为 InnoDB 和 TokuDB 估算的,对于 MyISAM 和 Aria (Maria) 存储引擎来说绝对正确。

    根据documentation

    行数。一些存储引擎,例如 MyISAM,存储 准确计数。对于其他存储引擎,例如 InnoDB,此值为 一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的 数。

    这也是在 MySQL 上查看行数的最快方法,因为查询如下:

    select count(*) from table;
    

    进行全表扫描可能是非常昂贵的操作,在大型高负载服务器上可能需要数小时。它还增加了磁盘 I/O。

    相同的操作可能会阻止表的插入和更新——这只发生在奇异的存储引擎上。

    InnoDB 和 TokuDB 都可以加表锁,但是需要全表扫描。

    【讨论】:

    • 这看起来是计算行数的最有效方法。我想知道为什么它不是答案?我正在使用 InnoDB。使用表锁,行数应该是准确的吧?
    • 对于innodb,它是估计的。但你可以在某些情况下使用“我们的网站有 xxx 个成员”、“我们检测到 xxx 结果与您的相似”等等。
    • 我不确定。但对于 Innodb 来说并不是真正的计数。但是对于百万行表来说非常有用。
    • 遍历表来计算每一行以获得行数是相当荒谬的。所以我也更喜欢这个答案。
    【解决方案3】:

    我们还有另一种方法可以在不对该表运行select 查询的情况下找出表中的行数。

    每个 MySQL 实例都有 information_schema 数据库。如果您运行以下查询,它将提供有关该表的完整详细信息,包括该表中的近似行数。

    select * from information_schema.TABLES where table_name = 'table_name'\G
    

    【讨论】:

    • 由于 MyISAM 存储行数,这在 MyISAM 表上是否也更快?
    • 我从未在 MyISAM 上测试过。
    【解决方案4】:

    简单地说:

    SELECT COUNT(*) FROM `tablename`
    

    【讨论】:

      【解决方案5】:
      select count(*) from YourTable
      

      【讨论】:

        【解决方案6】:

        如果你的表中有多个字段并且你的表很大,最好 不要使用 * 因为它将所有字段加载到内存中,使用以下将有更好的性能

        SELECT COUNT(1) FROM fooTable;
        

        【讨论】:

        • 这是不正确的。请参阅 stackoverflow.com/questions/5179969/… COUNT(1) 对于 MyISAM 实际上可能要慢得多。
        • @jcoffland 你可以自己试试,尤其是当你有一个 join 或者条件比 count(*) 快得多的时候。
        【解决方案7】:

        做一个

        SELECT COUNT(*) FROM table;
        

        您可以在此之后使用 Where 指定条件

        SELECT COUNT(*) FROM table WHERE eye_color='brown';
        

        【讨论】:

          【解决方案8】:

          正如 Santosh 所提到的,我认为这个查询相当快,而不是查询所有表。

          对于特定数据库中的特定表名

          返回数据记录数的整数结果

          select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
          AND table_name='tablename';
          

          【讨论】:

          • 这可能会返回估计的行数。在一个示例中,我使用 COUNT(*) 获得了 55,940,343 行,但使用此方法获得了 56,163,339 行,因此相差超过 200k。
          • @jcoffland,我在上面提到了 _ Santosh_ 的答案,它指出结果是近似。我的回答是更详细的实际查询。如果您想要精确计数,请使用具有性能意识的count(*),答案非常清楚
          【解决方案9】:
          $sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
          $total = 0;
          $sqls = mysql_query($sql,$conn);
          if ( $sqls ) {
              $total = mysql_result($sqls, 0);
          };
          echo "Total:".$total;`
          

          【讨论】:

          • 此答案已过时,mysql_result 在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中删除
          【解决方案10】:

          你必须使用 count() 返回匹配的行数 指定标准

          select count(*) from table_name;
          

          【讨论】:

            【解决方案11】:

            如果您有主键或唯一键/索引,则可能采用更快的方法(已使用 400 万行表进行测试)

            SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"
            

            然后得到基数场(接近即时)

            从 0.4s 到 0.0001ms 的时间

            【讨论】:

            • 这太棒了!为不可用的表计算行数。
            【解决方案12】:

            通过索引字段过滤可以方便地选择计数。试试这个

            EXPLAIN SELECT * FROM table_name WHERE key < anything; 
            

            【讨论】:

              猜你喜欢
              • 2014-12-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-23
              • 1970-01-01
              • 2023-03-12
              • 1970-01-01
              相关资源
              最近更新 更多