PDO :: rowCount VS COUNT(*)

Ben*_*Ben 20 php mysql optimization pdo

我有一个查询使用PDO,如果行> 1而不是获取数据,则首先计算行

SELECT * WHERE id=:id
$row=$SQL->rowCount();

if($row>0){
    while($data=$SQL->fetch(PDO::FETCH_ASSOC)){...

    }
}
else{echo "no result";}
Run Code Online (Sandbox Code Playgroud)

要么

SELECT COUNT(*), * WHERE id=:id
$data=fetch(POD::FETCH_NUM);
$row=data[0];


if($row>0){
//fetch data
}
else{echo "no result";}
Run Code Online (Sandbox Code Playgroud)

哪个会有更好的表现?

第2位.问题,如果我在id上设置了索引

哪一个更好COUNT(id)COUNT(*)

Chr*_*ark 23

第一个问题:

使用count COUNT(),服务器(MySQL)将在内部以不同方式处理请求.

这样做时COUNT(),服务器(MySQL)将仅分配内存来存储计数结果.

当使用$row=$SQL->rowCount();服务器(Apache/PHP)将处理整个结果集时,为所有这些结果分配内存,并将服务器置于提取模式,这涉及许多不同的细节,例如锁定.

请注意,PDOStatement::rowCount()返回受最后一个语句影响的行数,而不是返回的行数.如果关联执行的最后一个SQL语句PDOStatement是一个SELECT语句,则某些数据库可能会返回该语句返回的行数.但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序.

根据我的分析,如果你使用COUNT(),那么这个过程将分为MySQL和PHP,如果你使用的话$row=$SQL->rowCount();,处理将更多地用于PHP.

因此COUNT()在MySQL中更快.

第二个问题:

COUNT(*)比...更好COUNT(id).

说明:

count(*)mysql中的函数经过优化,可以查找值的计数.使用通配符意味着它不会获取每一行.它只能找到计数.所以count(*)尽可能使用.

资料来源:

  • `COUNT(id)比COUNT(*)更好.它不是.`COUNT(*)`更好 (3认同)
  • 5赞成答案,与问题没有多大关系.Stack Overflow处于最佳状态. (2认同)
  • downvote:用户想要计算获取的行,而不仅仅是表中的所有行.count(*)是错的. (2认同)

You*_*nse 14

事实上,这里既不需要PDO rowCount也不需要COUNT(*).

如果row> 1则获取数据

是一个错误的陈述.
在一个设计理智的Web应用程序中(我知道这听起来像是PHP的一个笑话),不必这样做.
最明智的方式是

  • 先取
  • 使用获取的数据
  • 如果需要,我们可以使用这个非常获取的数据来查看是否返回了任何内容:

    $data = $stmt->fetch();
    if($data){
        //use it whatever
    } else {
        echo "No record";
    }
    
    Run Code Online (Sandbox Code Playgroud)

简单,直接,没有像"哪个无用的功能更好"的问题.

在您的情况下,假设id是唯一索引,只能返回一行.因此,您根本不需要while声明.只需使用上面的代码段来获取并判断是否已获取enythin.

如果需要很多行,那么只需更改fetch()fetchAll()然后使用foreach迭代返回的数组:

$data = $stmt->fetchAll();
if($data){
    foreach ($data as $row) {
        //use it whatever
    }
} else {
    echo "No records";
}
Run Code Online (Sandbox Code Playgroud)

请注意,您永远不应该选择多于所需的行.意味着您在常规网页上的查询永远不会返回比显示的行更多的行.

说到问题本身 - 这没有任何意义.人们无法比较 rowCountVS COUNT(*),因为它是无与伦比的事情.这两个功能有着截然不同的目的,不能互换:

  • COUNT(*)返回带有count的单行,并且只有在需要记录计数但不需要记录本身时才必须使用.
    如果你需要记录,count(whatever)不是更快也不是更慢 - 这是毫无意义的.
  • rowCount()返回已选择的行数,因此您几乎不需要它,如上所示.

更不用说第二个例子根本不会获取任何行.