【问题标题】:SQL clause to optimize UPDATE queries?SQL 子句优化 UPDATE 查询?
【发布时间】:2010-02-04 22:26:53
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: php mysql redundancy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      查看要更新的内容很可能会花费更多。

      【讨论】:

        【解决方案3】:

        首先要回答的问题是为什么?

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

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

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

        【讨论】:

          【解决方案4】:

          您需要在代码中执行此操作。无论如何,您提供的“示例”查询为SQL injection 哭泣:)

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

          【讨论】:

          • 绝对是!出于演示目的,示例代码很好,但是,确实存在安全隐患。
          【解决方案5】:

          按照 Sunny 的建议,您必须对查询进行参数化。

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

          但是,这很可悲,除非您有大量的行,否则它不会对您的性能产​​生太大影响。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-20
            • 1970-01-01
            • 2013-03-07
            • 1970-01-01
            • 2020-08-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多