mysql更新多列一行单个语句vs多个语句

时间:2012-07-06 04:29:22

标签: php mysql

我试图仅在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次。

提前致谢!

2 个答案:

答案 0 :(得分: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;
}

if ($update)
{
    mysql_query(sprintf("UPDATE table1 SET field_1 = '%s', field_2 = '%s'", $_POST["field_1"], $_POST["field_2"]));
}
if (

答案 1 :(得分:0)

方法B当然会更昂贵,因为在条件下你做了3次不同的选择与方法A的单次选择/更新。

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