无意义的SQL与PHP如果

时间:2013-04-08 04:09:21

标签: php mysql performance

我需要使用像这样的代码来操作mySQL表中的条目

foreach($items as $item)
{
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

$ item中可能有多达50个项目。此代码的变体是

foreach($items as $item)
{
 if ('z' != $img->img)
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 if ('z' != $item->lili)
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

在这两种情况下,我都在为$ items中的EACH项执行一系列SQL语句。我的问题

  1. 构建$ sql然后执行它会不会更有效率?
  2. 但是如果$ items中的所有50个项目都产生了有意义的SQL,那么这并不意味着一堆非常缓慢的SQL语句?
  3. 最后,如果在我的代码的第二个版本中执行PHP if 测试或者只是构建SQL并让mySQL处理WHERE测试返回空行的事实,那么它是否更好?
  4. 我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用in子句,例如

$sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")"

并将您自己简化为一个SQL查询。但是,如果您尝试使用巨大的aray,则可能会失败 - 生成的查询可能会超出max_allowed_pa​​cket设置并被杀死。

至于你的strlen ......将strlen结果与'z'进行比较有什么意义? strlen返回一个整数,你也可以改为if (apple == orange)

答案 1 :(得分:1)

首先,我建议您使用IN子句,只有2个单独的查询... 你可能要逃避那两个元素$ item-> img和$ item-> lili ..

$ids = array("siteims"=>array(), "lists"=>array());
foreach($items as $item)
{
    $ids['siteims'][] = "'" . $item->img . "'";
    $ids['lists'][] = "'" . $item->lili . "'" ;
}
if(!empty($ids['siteims'])){
    $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")";
    $dbh->exec($sql);
}

if(!empty($ids['lists'])){
    $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")";
    $dbh->exec($sql);
}