1

3つの値のいずれかが異なる場合にのみ、mysqlの行の3つの列の値を更新しようとしています。

私はのテーブルを持っていると言う

x、y、z、id列

私は現在、

方法A

update foo set x = 'x_value', y = 'y_value', z = 'z_value' where id = 'unique_id'
and ((x <> 'x_value') or (y <> 'y_value') or (z <> 'z_value'))

私はmysqlの理論的なベンチマーク/アーキテクチャについてあまり知りません、そして私はステートメントが

方法B

update foo set x ='x_value' where id = 'unique_id' and ((x <> 'x_value')); 
update foo set y ='y_value' where id = 'unique_id' and ((y <> 'y_value')); 
update foo set z ='z_value' where id = 'unique_id' and ((z <> 'z_value')); 

優れているか優れています。

メソッドBは、1つの列のみが変更された場合に1回の書き込みと3回の読み取りのみを実行するのに対し、メソッドAでは3回の書き込みと3回の読み取りを実行することに気付きました。メソッドBは、行に3回インデックスを付けます。

前もって感謝します!

4

2 に答える 2

1

コメントで読んだ内容に基づいて、単に更新を実行する必要があるという octern に同意します。使用するリソースが大幅に少なくなり、テーブルエンジンに基づいて、テーブル/行のロックを短時間で解放し、テーブルのパフォーマンスを大幅に向上させます。

ただし、書き込みを行う前にチェックを行いたい場合は、PHP を使用してください。select ステートメントを実行し、PHP のコードを比較して、適切なテーブルを更新するだけです。例えば:

$res = mysql_query("SELECT * FROM table1 WHERE PK_ID = '0'");
$arr = mysq_fetch_assoc($res);
$update = false;
if ($arr["field_1"] != $_POST["field_1"])
{
    $update = true;
}

if ($arr["field_2"] != $_POST["field_2"])
{
    $update = true;
}

もし ($アップデート)
{
    mysql_query(sprintf("UPDATE table1 SET field_1 = '%s', field_2 = '%s'", $_POST["field_1"], $_POST["field_2"]));
}
もしも (
于 2012-07-06T05:13:23.790 に答える
0

方法 B は、条件に応じて方法 A の単一の選択/更新に対して 3 つの異なる選択を行うため、もちろんよりコストがかかります。

そのほとんどは、1 つのステートメントと 3 つのステートメントの比較です。どちらも更新ステートメントであるため、1 の方が高速です。

于 2012-07-06T04:42:26.660 に答える