1

我正在将一个旧的 mysql_X 站点转换为使用 PDO,到目前为止,一切都很好(我认为)。但是,我对计算查询结果的可靠性有疑问。

目前,我的一切都是这样的(我已经删除了 try / catch 错误代码以使其更易于阅读):

$stm = $db->prepare("SELECT COUNT(*) FROM table WHERE somevar = '1'");
$stm->execute();
$count = $stm->fetchColumn();

if ($count > 0){
    $stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
    $stm->execute();
    $result = $stm->fetchAll();
}

这样做可能会出现愚蠢的问题,如果有的话,我邀请您告诉我,但我的问题实际上是关于减少数据库查询。我注意到,如果我删除第一个语句,自行运行第二个语句,然后使用 PHP 的 count() 来计算结果,我似乎仍然可以获得可靠的行数,只有一个查询,如下所示:

$stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
$stm->execute();
$result = $stm->fetchAll();

$count = count($result);
if ($count > 0){
    //do whatever
}

这样做有什么陷阱吗?它可靠吗?我的 PDO 中是​​否有任何明显的愚蠢错误?谢谢您的帮助!

4

4 回答 4

2

最好在 MySQL 中进行计数,特别是如果计数值是您感兴趣的唯一结果。将您的版本与等效问题“杂货店有多少巧克力棒库存?”进行比较。

1)在数据库中数:SELECT count(*) ....开车去商店,数巧克力棒,记下数字,开车回家,从纸条上读出数字

2) 在 PHP 中计数:SELECT * .... 开车去商店。购买所有的巧克力棒。用卡车把他们送回家。在客厅地板上数一数。将结果写在一张纸上。扔掉巧克力棒。从纸上读出数字。

哪一个更高效/成本更低?如果您的数据库/表只有几条记录,这没什么大不了的。当您开始达到数千/数百万条记录时,版本 2) 绝对是可笑的,并且可能会消耗您的带宽,炸毁您的 PHP 内存限制,并将您的 CPU 使用率推高。

话虽如此,运行两个查询是没有意义的,一个只是计算您可能获得多少记录。这样的系统容易受到竞争条件的影响。例如,您进行计数并获得(例如)1 条记录。当您运行第二个查询并获取该记录时,其他一些并行进程已经插入另一条记录,或者删除了您想要的记录。

于 2013-01-18T18:25:23.170 回答
0

在第一种情况下,您使用 MYSQL 进行计数,在第二种情况下,您使用 PHP 进行计数。两者本质上是相同的结果。

于 2013-01-18T18:13:08.073 回答
0

您对查询的使用是正确的。使用 LIMIT 时会出现唯一的问题,因为 COUNT(*) 和 count($result) 会不同。

COUNT(*) 将计算查询将返回的所有行(假设计数查询相同且不使用 LIMIT)

count($result) 将只计算返回的行,所以如果你使用 LIMIT,你只会得到给定限制的结果。

于 2013-01-18T18:13:22.320 回答
0

是的,在这个用例中它是可靠的!

于 2013-01-18T18:14:05.120 回答