是否值得在更新前使用 select 检查值

McC*_*Cuz 6 mysql

我的行中有一个tinyint布尔值,0默认情况下以及1每当发生特定事情时。在它之后1,它总是会留下来1。现在每一行都可能发生多次特定的事情,但我只需要将值更新为1一次。

是否值得做一个SELECT,检查值,只有当值是0,才触发UPDATE

也可能这个

UPDATE table SET lock='1' WHERE id='100' AND lock='0'
Run Code Online (Sandbox Code Playgroud)

UPDATE table SET lock='1' WHERE id='100'
Run Code Online (Sandbox Code Playgroud)

对于我的情况?

sti*_*bit 5

好吧,“13.2.11 UPDATE Syntax”表明,当值实际上没有改变时,没有写入完成。

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

因此WHERE不需要扩展子句来防止不必要的写入。

但是您可能会从扩展WHERE子句中获得微小的性能优势,就像没有找到要更新的记录一样,检查逻辑是否确实需要更改行将不会运行。但真的,那是很小的。

检索的努力以任何一种方式存在。你只能尝试用指数(上给予支持idlock(化合物)的扩展版本,并id为其他)。


Bre*_*zar 5

EzLo 为您提供了一份很好的正面清单,我将只抛出一个负面消息。我不认为它适用于您的情况,但我在此处记录此内容,供其他人稍后阅读此答案以供自己使用。

如果您的查询可能会更新多个字段,那么构建所有这些不同的查询将会产生成本:

假设我们只更新某人的姓氏:

UPDATE dbo.Users 
  SET LastName = 'Smith' 
  WHERE id='100' AND LastName = 'Jones';
Run Code Online (Sandbox Code Playgroud)

但是假设我们也在更新他们的姓氏和地址:

UPDATE dbo.Users 
  SET LastName = 'Smith',
      StreetAddress = '123 Main Street',
      City = 'San Francisco',
      State = 'CA'
  WHERE id='100' 
    AND LastName = 'Jones'
    AND City = 'New York'
    AND State = 'NY';
Run Code Online (Sandbox Code Playgroud)

要构建这样的查询,您需要在应用程序代码中进行大量相等性检查。另外,更糟糕的是,当使用不同的参数组合时,您最终会使用许多不同的更新字符串使计划缓存膨胀 - 因为有时我们只更新姓氏,有时我们只更新姓氏和城市,有时我们更新城市和州,但不更新姓氏等。


EzL*_*zLo 4

是的,它的价值有几个原因:

  • 您可能会受益于该列上的索引。
  • 对于已经更新的情况来说,这似乎是毫无意义的更新1,但它可能会在更新表上执行触发器。
  • 避免记录更新操作中的额外行。即使前一个值与新值匹配,数据库仍然会记录该操作(不同的是分配同一列的值lock,在这种情况下将跳过该值)。

  • @EzLo 您是否对有关使用 pre UPDATE SELECT 语句的问题回答“是”,或者对有关在 UPDATE 语句的 WHERE 子句中包含额外条件的问题回答“是”?或者你是说他应该两者都做? (3认同)