問題是,當您在更新中設置值時,它實際上會覆蓋舊值,這比檢查值是否應該被覆蓋花費更長的時間。所以,你有以下情況:
案例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會注意到這一點並且不會更新它。所以,你不需要第二個條件。只是保持簡單。 –