使用PDO和MySQL的SELECT COUNT(*)的最佳性能替代方案

时间:2010-09-07 16:07:53

标签: php mysql pdo

我之前读过SELECT COUNT(*) MySQL不具备PHP Data Objects (PDO)的性能,应该定期避免。 (作为一个附带问题,这只是大量行的情况吗?)

我正在使用MySQL访问{{1}}。

我应该如何考虑性能因素来计算行数?

3 个答案:

答案 0 :(得分:8)

如果您使用的是 MyISAM表,则表示效果不佳。 MySQL 缓存 MyISAM表中的行数。这就是它能够立即回答COUNT(*)的原因。在这种情况下,MySQL只会从存储的值中读取表中的行数。

[编辑]:来自MySQL Performance Blog:

对于InnoDB:如果您有SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5之类的查询,则通过执行索引范围扫描,此查询将以相同的方式执行MyISAM和Innodb表。对于MyISAM和Innodb,这可以更快或更慢,具体取决于各种条件。

在实际应用程序中,有更多的第二种类型的查询而不是第一种类型的查询,所以它通常不像它看起来那么糟糕。管理工具最需要的行数可以在表统计中显示,它也可以在应用程序统计中用于显示类似“我们有123.345用户已上传1.344.656图像”但这些通常很容易删除。

  

所以请记住Innodb对于所有COUNT()查询并不慢,但仅针对没有WHERE子句的COUNT()查询的特定情况。

同样有趣的读物:

答案 1 :(得分:2)

COUNT(*),据我所知,实际上比使用COUNT(columnname)更有效。如果您正在寻找行计数,那么这些将比通过PDO或MySQL计算行数更有效率(因为您不仅仅需要执行select,因此很可能必须提取所有行。 count())。

我不确定是否有任何其他方法来计算,但这应该没问题,取决于你在做什么。您应该关注的主要项目是确保您的表具有正确的indexes设置,因为这将显着提高MySQL速度等,如果操作正确的话。

答案 2 :(得分:1)

PDO与运行特定计数查询无关。 PDO就是你连接MySQL的方式。如果只需要行计数,则不应使用count(colname),应使用count(*)。如果指定colname并且该列未指定为NOT NULL,则它将很慢。 http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/

MyISAM表缓存计数,因此MyISAM表上的计数()始终是立即的。 InnoDB需要一段时间,因为表的状态可能会不断变化,最终会得到一个估计值。您可以为InnoDB执行计数(colname),其中colname是自动增量字段。这将是相当快速和准确的,尽管从未像MyISAM表上的count()那么快。