1

私が取り組んでいる時間依存のスクリプトがあり、microtime() を使用してボトルネックを見つけました。時間の増加は、300 以上の値をチェックして、それらがデータベースに 1 つずつ存在するかどうかを 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;
        }
    }   

助言がありますか?不明な点があれば、さらに説明できます。

ありがとう、ニック

4

1 に答える 1

2

IN (?,?,?,?,?...)したがって、リストを使用して、完全な配列でクエリを発行するだけです。

// abstract, use a PDO wrapper of your choosing
$query = db("SELECT * FROM cache WHERE value IN (??)", $values);

次に、結果リストを反復処理します。一致した $values のみが返されます。したがって、それから最初のリストを作成します。

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

存在しないエントリのリストを取得するには、それを元の配列と比較するだけです:

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

もちろん、2 番目のNOT INクエリを使用することもできます。しかし、PHP でその差別化を行う方が簡単です。

于 2012-09-05T03:10:36.633 に答える