【问题标题】:is SELECT COUNT(*) expensive?SELECT COUNT(*) 贵吗?
【发布时间】:2011-07-31 17:13:25
【问题描述】:

您认为在每次页面加载时从一个非常大的表(如 50K 行)中计算条目是个好主意吗?

SELECT COUNT(*) FROM table

现在我有 2000 行,看起来相当快,我没有看到页面加载有任何延迟 :)

但是该表应该达到 50K 条目...我很好奇它将如何加载

(ps:这个显示行数的页面是私有的,在管理界面中,不是公共的)

【问题讨论】:

  • 如果/当它成为一个问题......已经有很多解决方案。
  • MyISAM 速度很快,因为存储了行数,但我认为您没有使用 MyISAM。
  • 表格类型在我的phpmyadmin中显示MyISAM
  • 那么 COUNT(*) 的性能成本最低。您实际上是在每次提出问题时都创建新帐户,还是有那么多 Emma 的 SQL 问题?
  • 大声笑不,但我禁用了 cookie,而且我每次都失去我的名字 :)

标签: mysql database select count


【解决方案1】:

COUNT(*) 被优化为如果 SELECT 从一个表中检索,没有检索到其他列,并且没有 WHERE 子句,则返回非常快。例如:

mysql> SELECT COUNT(*) FROM student;

此优化仅适用于 MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问。

Source

正如您所说,您使用 MyISAM 并且您的查询是针对整个表的,它是 1 行还是 100000 行都没有关系。

【讨论】:

  • 仅供参考:在 ANSI-92 SQL dba.stackexchange.com/questions/2511/… 中提到
  • 这个例子没用。通常人们希望根据一些标准来计数,例如 select count(*) where .... 然后无法使用存储的行计数器,
【解决方案2】:

正如您所说,此页面是 pvt 且不公开,我认为该查询和 50k 条记录没有任何问题,应该不会对页面加载时间和服务器负载产生任何实际影响。

【讨论】:

    【解决方案3】:

    MyISAM 引擎在内部存储行数,所以当发出像SELECT COUNT(*) FROM table 这样的查询时,它会很快。另一方面,使用 InnoDB 需要一些时间,因为它会计算实际行数。这意味着 - 更多的行 - 它变得越慢。但是有一个技巧,你可以使用一个小的覆盖索引来计算表中的所有行——然后它很快。另一个技巧是简单地将行数存储在相应的汇总表中。

    【讨论】:

      【解决方案4】:

      COUNT(*) 不是一个昂贵的操作,它实际上返回的数据只是查看索引。即使在 50k 的桌子上也应该没问题。

      如果您在加载时遇到问题,那么此时可以很容易地收回和优化。

      【讨论】:

        【解决方案5】:

        在 MyISAM 中,当没有任何“WHERE”条件时,count(*) 会被优化掉,因此即使有数十亿行,查询也非常快。

        在分区表的情况下,如果在定义分区的列上有一个简单的条件(例如:计算逻辑表的几个物理表上的所有行),我们可以认为它的行为方式相同。但事实并非如此:它会在所考虑的物理表的所有行上循环,即使我们想将它们全部计算在内。例如这里,在一个 9800 万行的表上划分为 40 个表,计算最后 32 个物理表的行数需要 5 分钟以上。

        【讨论】:

          【解决方案6】:

          可以。根据this forum,PostgreSql 将对数据库进行一次完整的扫描以计算出计数。

          【讨论】:

          • 而且 MySQL/SQL Server/Sybase 也不使用 MVCC。
          【解决方案7】:

          count(*) 是 O(n) 所以它的性能与表中的记录数有关,50k 根本不是很多,所以我认为在管理页面上很好。当您达到数百万时,count(*) 肯定会变得昂贵。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-05
            • 1970-01-01
            • 2011-08-12
            • 1970-01-01
            • 2016-12-23
            • 2016-07-27
            • 2014-01-19
            • 1970-01-01
            相关资源
            最近更新 更多