我之前读过SELECT COUNT(*)
MySQL
不具备PHP Data Objects (PDO)
的性能,应该定期避免。 (作为一个附带问题,这只是大量行的情况吗?)
我正在使用MySQL
访问{{1}}。
我应该如何考虑性能因素来计算行数?
答案 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()那么快。