SQL子句优化UPDATE查询?

时间:2010-02-04 22:26:54

标签: php mysql redundancy

在我虚构的数据库中,我有几列数据。在设计脚本的PHP前端时,必须允许用户在必要时修改元组的所有属性。

如果最终用户最终只修改了一个属性而不是所有属性,则使用以下语句:

UPDATE foo 
   SET name='bar' location='YYZ' drink='ale' 
 where user='smithj'`

将更新元组“smithj”的所有三个属性,即使其中两个属性相同。

有没有办法让SQL(MySQL,如果它有所作为)自动过滤掉冗余更新,类似于IF EXISTS中的CREATE TABLE IF EXISTS子句?

谢谢!

5 个答案:

答案 0 :(得分:1)

就此而言,您个人最有可能尝试进行预成熟优化。更新三个值以使它们成为需要的就好了。

检查要更新的内容最有可能花费更多。

答案 1 :(得分:1)

要回答的第一个问题是为什么?

我看到的唯一原因是表现。但性能挑战可能有两个原因:

  • 在您的应用程序和数据库之间移动数据。您可以通过仅包含update语句中实际需要更新的列来减少这种情况。但是,当我们谈论三个专栏时,这是很多工作,可能不值得。另请注意,此创建的大量不同的sql语句可能会导致某些数据库内部缓存。我不知道MySQL是否属实,但它适用于oracle。 (假设您使用绑定变量(您应该使用))

  • 并实际操作数据库中的数据。但是在那个阶段,找到要更新的记录(where子句)比实际更新它要昂贵得多。而且我猜这就是没有任何功能的原因,当旧的和新的值实际上是相同的时候会改变更新

答案 2 :(得分:1)

“如果您将列设置为当前的值,MySQL会注意到这一点并且不会更新它。”

http://dev.mysql.com/doc/refman/5.0/en/update.html

答案 3 :(得分:0)

您需要在代码中执行此操作。在任何情况下,您提供的“示例”查询都会对SQL injection:}

发出呼喊

使用参数化查询,即时构建它们,并仅添加要更新的项目。

答案 4 :(得分:0)

与Sunny建议的一致,你必须参数化你的查询。

一个选项可能是这个(在高级伪代码中): 当用户编辑项目时(比如说在keyPress上),您可以标记该单元格。 您可以从每个标记的单元格中获取值,并仅将它们的值传递给参数化查询。

然而,这很难过,除非你有大量的行,否则不应该对你的表现造成太大的影响。