我有一个使用 PDO 的查询,首先计算行数,如果行 >1 则获取数据
SELECT * WHERE id=:id
$row=$SQL->rowCount();
if($row>0){
while($data=$SQL->fetch(PDO::FETCH_ASSOC)){...
}
}
else{echo "no result";}
或
SELECT COUNT(*), * WHERE id=:id
$data=fetch(POD::FETCH_NUM);
$row=data[0];
if($row>0){
//fetch data
}
else{echo "no result";}
哪个性能更好?
第二。问题,如果我在 id 上设置了索引
哪个更好 COUNT(id)
或 COUNT(*)
最佳答案
第一个问题:
使用count COUNT()
,服务器(MySQL)内部会以不同的方式处理请求。
在做COUNT()
时,服务器(MySQL)只会分配内存来存储计数的结果。
使用 $row=$SQL->rowCount();
时,服务器 (Apache/PHP) 将处理整个结果集,为所有这些结果分配内存,并将服务器置于获取模式,其中涉及很多不同的细节,例如锁定。
请注意,PDOStatement::rowCount()
返回受最后一条语句影响的行数,而不是返回的行数。如果关联的 PDOStatement
执行的最后一条 SQL 语句是 SELECT
语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都可以保证这种行为,并且不应依赖于可移植应用程序。
根据我的分析,如果你使用COUNT()
,进程会被分到MySQL和PHP,而如果你使用$row=$SQL->rowCount();
,对 PHP 的处理会更多。
因此 COUNT()
在 MySQL 中更快。
第二个问题:
COUNT(*)
优于 COUNT(id)
。
解释:
mysql 中的 count(*)
函数被优化用于查找值的计数。使用通配符意味着它不会获取每一行。它只找到计数。所以尽可能使用 count(*)
。
来源:
关于php - PDO::rowCount 与 COUNT(*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19109774/