我的行中有一个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)
对于我的情况?
好吧,“13.2.11 UPDATE Syntax”表明,当值实际上没有改变时,没有写入完成。
如果您将一列设置为它当前拥有的值,MySQL 会注意到这一点并且不会更新它。
因此WHERE
不需要扩展子句来防止不必要的写入。
但是您可能会从扩展WHERE
子句中获得微小的性能优势,就像没有找到要更新的记录一样,检查逻辑是否确实需要更改行将不会运行。但真的,那是很小的。
检索的努力以任何一种方式存在。你只能尝试用指数(上给予支持id
和lock
(化合物)的扩展版本,并id
为其他)。
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)
要构建这样的查询,您需要在应用程序代码中进行大量相等性检查。另外,更糟糕的是,当使用不同的参数组合时,您最终会使用许多不同的更新字符串使计划缓存膨胀 - 因为有时我们只更新姓氏,有时我们只更新姓氏和城市,有时我们更新城市和州,但不更新姓氏等。
是的,它的价值有几个原因:
1
,但它可能会在更新表上执行触发器。lock
,在这种情况下将跳过该值)。 归档时间: |
|
查看次数: |
3873 次 |
最近记录: |