1

ユーザーの XML 入力 (通常は 20 から 100 程度の複数のレコード/アイテムを含む) を受け取り、それを解析して、レコードのデータベースと照合する PHP コードを作成しています。レコードがデータベースにない場合、PHP スクリプトはそれを INSERT する必要があります。レコードがデータベースにある場合、スクリプトは、ユーザーが [レコードを置換] チェックボックスをオンにしているかどうかに応じて、ユーザーの入力を破棄するか、そのレコードの UPDATE を実行する必要があります。

私の質問は、どちらが速いかということです.テーブル全体の一意性を判断する列を選択し、PHP でそれらを並べ替えるには? または、レコードごとに SELECT COUNT() FROM table WHERE name=(input name) AND region=(input region) を実行し、レコードが返されるかどうかを確認するには?

1 つの大きな SQL クエリ + かなりの PHP ソート時間、または 100 の小さな SQL クエリと 1 つの PHP 比較?

編集:人々は詳細を要求しているので、:

データベースのサイズ: 250 レコード以下インデックス付きの
列:まだインデックスを入れていませんが、製品版では名前と地域の列にインデックスを設定します。
返される SELECT の形式:大きな SELECT を実行すると、使用している DB クラス (WPDB) により、行オブジェクトの連想配列で返されます。 一意性を構成するもの:名前列と地域列によって、レコードが一意かどうかが決まります。名前と地域の組み合わせがデータベースにない場合、レコードは一意です。

たとえば、name:"Paris" region:"France"name:"Paris" region:"Texas"は 2 つの一意のレコードです。ただし、name:"Paris" region:"France"name:"Marseilles" region:"France"も同様です。

4

2 に答える 2

0

最初に DB 全体を SELECT し、次に配列を作成して in_array() を使用してチェックします。

$array = array();
$query = .......
while ($row = mysql_fetch_assoc($query)) {
  array[] = $row['id'];
}
foreach ($xml_array as $line) {
   if (in_array($line['id'], $array)) {
       ##ALREADY in database
       if (<other condition>) {
            #UPDATE THE ROW
       }
   }
   else {
      ##INSERT INTO DATABASE
   }
}

もちろん、私の例では「id」を列として使用していますが、何でも使用できます。

幸運を!

于 2012-07-26T00:15:16.103 に答える
0

「REPLACE INTO」を使用する方が高速です。構文は「INSERT INTO」とまったく同じですが、インデックス (主キーまたは一意のインデックス) のために一意である必要がある一意ではない値がある場合、既存のレコードが置き換えられます。事前に確認する必要はなく、1 つのクエリです。

replace はレコード全体を置き換えることに注意してください。単純に 1 つのフィールドを更新する場合は、"INSERT INTO... ON DUPLIACTE KEY UPDATE field=value" を実行すると、新しいレコードが挿入されるか、既存のレコードが更新されます。まだ1つのクエリ。

他の部分 (チェックボックスがオンになっている場合はレコードを削除する) については、「DELETE」を実行するだけで、レコードがそこにない場合は削除されません - 繰り返しますが、1 つのクエリです。

このようにして、チェックと更新の間にレコードが追加/削除されるリスクを冒さず、さらにクエリを保存し、さらに他の誰かが何が起こっているかを簡単に読み取ることができます.

于 2012-07-26T00:15:41.347 に答える