问题是,当您在更新中设置值时,它实际上会覆盖旧值,这比检查值是否应该被覆盖花费更长的时间。所以,你有以下情况:
案例1:您update
每is_new
到0
- 如果
user_id
比赛和is_new
不0
,那么它将正确地进行更新,以0
- 如果
user_id
比赛和is_new
已经是0
,那么它将update
到0
,但它会花费更长的时间,因为它是一个写操作
案例2:你set
is_new
到0
,如果它是不是已经0
- 如果
user_id
比赛和is_new
不0
,那么它会检查它是否是0
,因此,正确地更新它0
- 如果
user_id
匹配和is_new
已经0
,那么它会检查它是否是0
并且将le AVE记录,因为它是
让我们假设你有update
x
记录,但是,从x
记录,只有y
有没有0
is_new。检查is_new
是否0
需要a
时间并更新is_new
至0
需要b
时间才能平均记录。在这种情况下:
如果不筛选出记录,其中is_new
已经0
,则: 你会update
所有的记录,这需要时间x * b
。
如果您筛选出记录,其中is_new
已经0
,则: 您将检查is_new
的记录,这需要x * a
然后将更新y
记录,这需要y * b
。
直观地说,我认为写作花费如此多的时间,即:
x * a + y * b < x * b
但是,肯定的事情将是标杆,看看一些测量,因为地球上没有人会告诉你如何你的mysql在引擎盖下执行你的查询。
编辑:
根据意见,显然,该文件指出,如果一个字段更新为当前值,那么MySQL会注意到这个问题,并不会执行更新。
如果您将列设置为当前的值,MySQL会通知此 并且不会更新它。
Source。
这并不改变这样一个事实,即如果需要进行优化,应该进行实验,因为如果报价被证明是错误的,那么这不会是文档首次出现缺陷。此外,这些想法对其他情况也应该是有用的,因为引用仅涉及=运算符的条件,并且如果应该检查其他条件,引用的MySQL功能将不适用。
是ofcourse,您的第二个条件将减少执行时间 –
您可能需要更新的NULL了。然后:'和is_new <> 0或is_new为空)'。 –
MySQL文档陈述了这一点:'如果你将列设置为当前的值,MySQL会注意到这一点并且不会更新它。所以,你不需要第二个条件。只是保持简单。 –