对于SQL行数统计,使用PDO rowCount还是count(*) AS更有效率?

3

在我的脚本中,我有大约15个SQL查询只是为了计算行数并将其显示给用户。

最有效的方法是什么?

我应该使用:

$stmt=$cxn->prepare("SELECT id FROM items WHERE seller=?");
$stmt->execute(array($username));
echo $stmt->rowCount();

或者这个:
$stmt=$cxn->prepare("SELECT count(*) as count FROM items WHERE seller=?");
$stmt->execute(array($username));   
while($row=$stmt->fetch(PDO::FETCH_ASSOC))
    echo $row['count'];

感谢提前预先安排。

1
请参见http://stackoverflow.com/questions/5315550/pdo-difference-between-rowcount-and-sql-countcol。 - Ian Gregory
还有一件事,你可以将这15个select count(*)语句分组成一个语句,这样可能会更快。 - nycynik
好的,听起来不错。这样看起来也更好。谢谢。 - alexx0186
3个回答

2
简短回答是Count(*)更快。但是,这仅适用于您不使用数据的情况。如果您要选择数据并想要计数,则请使用第一种方法。
("SELECT id FROM items WHERE seller=?");

如果表上有索引,那么查询将几乎立即返回。

1
不使用COUNT聚合函数意味着数据库将返回所有行,将其发送到PHP,然后报告计数。这是非常低效的带宽使用方式... - OMG Ponies
嗨,谢谢你的回复。我理解你的观点,Count 似乎更可行。敬礼 - alexx0186
是的,我的意思是使用 count,但如果你也要获取数据就不要使用它。如果你需要数据和计数,先执行 select,然后使用 ->rowCount()。如果你不需要数据,只需在 select 中使用 count(1)。 - nycynik

1

rowCount命令不仅适用于SELECT查询,还适用于UPDATE、INSERT等操作。因此这是一个好处。

然而根据PDO文档:

并非所有数据库都保证可靠性,不应依赖于可移植应用程序。

因此,在您的情况下,我建议使用count而不必担心性能问题,尽管它会稍微快一些。


0

使用MySQL行计数会更快。PHP和数据库之间需要的带宽更少。


rowCount()和$row['count']都不会与服务器通信。它们只是从PHP中已经在内存中的结果集中获取数据。SELECT id返回一个更大的结果集,使用了比SELECT COUNT(*)更多的带宽,后者只返回单个整数值在单行中。 - Ami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接