我试图仅在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次。
提前致谢!
答案 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将更快,因为它们都是更新语句。