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(*)尽可能使用.
资料来源:
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()返回已选择的行数,因此您几乎不需要它,如上所示.更不用说第二个例子根本不会获取任何行.