我有一个使用 PDO 的查询,首先计算行数,如果行 >1 则获取数据
SELECT * WHERE id=:id
$row=$SQL->rowCount();
if($row>0){
while($data=$SQL->fetch(PDO::FETCH_ASSOC)){...
}
}
else{echo "no result";}
or
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)
or COUNT(*)
第一个问题:
使用计数COUNT()
,服务器(MySQL)内部将以不同的方式处理请求。
做的时候COUNT()
,服务器(MySQL)只会分配内存来存储计数结果。
使用时$row=$SQL->rowCount();
服务器(Apache/PHP)将处理整个结果集,为所有这些结果分配内存,并将服务器置于获取模式,这涉及许多不同的细节,例如锁定。
请注意PDOStatement::rowCount()
返回受最后一条语句影响的行数,而不是返回的行数。如果关联的最后执行的 SQL 语句PDOStatement
was a SELECT
语句,某些数据库可能会返回该语句返回的行数。但是,并不能保证所有数据库都具有这种行为,并且不应依赖于可移植应用程序。
根据我的分析,如果你使用COUNT()
,该过程将分为 MySQL 和 PHP,而如果您使用$row=$SQL->rowCount();
,PHP 的处理会更多。
所以COUNT()
MySQL 中速度更快。
第二个问题:
COUNT(*)
比COUNT(id)
.
解释:
The count(*)
mysql 中的函数经过优化以查找值的计数。使用通配符意味着它不会获取每一行。它只找到计数。所以使用count(*)
只要有可能。
Sources:
- PDO语句::rowCount http://www.php.net/manual/en/pdostatement.rowcount.php
- MySQL 计数(*) http://dev.mysql.com/doc/refman/5.1/en/counting-rows.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)