PDO检查数据库中是否存在300多个值的最佳方法

时间:2012-09-05 02:58:50

标签: php mysql caching optimization pdo

我有一个依赖时间的脚本我正在研究并使用microtime()来找到瓶颈。我确定时间增加是由对300+值进行检查以查看它们是否一次存在于数据库中,每次查询0.04秒。

脚本的背景是它是一个缓存脚本。我需要查看它是否存在于DB中,因此我需要一个true / false(由rowCount获取),但我还需要一种方法将false与值相关联,以便我可以更新它。我知道使用WHERE标记IN(:ARRAY)比单个调用工作得更快,但我想不出在这种方法中应用true / false关联的方法。

我目前的代码如下:

//loop through all our values!
    //prepare out reusuable statement
$stmt = $db->prepare("SELECT * from cache WHERE value=?");

foreach($values as $tempVal)
{
    //find if its in the database
    try
    {
        $stmt->execute(array($tempVal));
        $valCount = $stmt->rowCount();
    } catch(PDOException $ex) {
        echo "PDO error send this to us: " . $ex->getMessage();
    }

    //update flag
    $addToUpdate = 1;

    //if its in the database
    if($valCount > 0)
    {
        //get the tag data
        $valRes= $stmt->fetch();

        //check if cache expired
                    $addToUpdate = 0;
    } 

    //add to update list
    if($addToUpdate)
    {
                    //needs updating
        $updateList[] = $tempVal;

        //add to not in DB list to minimize queries
        if($tagTCount == 0)
        {
            $notInDB[$tempVal] = $tempVal;
        }
    }   

有什么建议吗?如果有什么不清楚,我可以解释更多。

谢谢你, 尼克

1 个答案:

答案 0 :(得分:2)

因此,您只需使用IN (?,?,?,?,?...)列表

向完整数组发出查询
// abstract, use a PDO wrapper of your choosing
$query = db("SELECT * FROM cache WHERE value IN (??)", $values);

然后迭代结果列表。只返回匹配的$值。因此,建立您的第一个列表:

foreach ($query as $row) {
     $updateList[] = $row["value"];
}

要获取缺席条目的列表,只需diff针对原始数组:

$notInDB = array_diff($values, $updateList);

您当然可以使用第二个NOT IN查询。但是在PHP中进行这种区分更简单。