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 只会执行一次写入和 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);
$更新=假;
if ($arr["field_1"] != $_POST["field_1"])
{
    $更新=真;
}

if ($arr["field_2"] != $_POST["field_2"])
{
    $更新=真;
}

如果($更新)
{
    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 的成本当然会更高,因为您进行了 3 次不同的选择,而方法 A 的单选/条件更新。

它几乎是 1 个语句与 3 个语句的比较。1 会更快,因为它们都是更新语句。

于 2012-07-06T04:42:26.660 回答