2017-09-14 54 views
0

可以說我有3億用戶在我的mysql數據庫(innodb)。其中一些有username設置,而其中一些不(用戶名爲空),並且可以說60%不是空(具有實際的varchar值)。沒有一個WHERE子句,只是咧空他們都 -MySQL更新性能有或沒有的地方是NULL

如果我想將所有3個億用戶的用戶名爲空,將

UPDATE users SET username = null WHERE username IS NOT NULL

表現比

UPDATE users SET username = null更好?

我知道WHERE在設置實際值時總是執行得更快,但是不知何故空字段讓我想到了這一點。

+1

如果您有用戶名索引,WHERE會更好,否則應執行相同的操作,因爲需要執行完整掃描。在這種情況下,賦值爲null或值不會有任何區別。 –

+0

閱讀解釋查詢以查詢性能的自我評估。 – manu

+0

查看這個小提琴以獲得更好的理解:https://www.db-fiddle.com/#&togetherjs=De4TPIMgUO – manu

回答

1

兩者都需要很長的時間。我建議你做在「塊」在我的博客中描述: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

這裏是另一種解決方案:

ALTER TABLE t DROP COLUMN c; 
ALTER TABLE t ADD COLUMN c VARCHAR(...) DEFAULT NULL; 

每個ALTER將不書面表格複製過一次向回退日誌(等),因此顯着更快。 (我懷疑你是否可以將兩者合併爲一個聲明。)

但首先,讓我們來回顧並討論爲什麼您需要執行此異常任務。這可能表明一個糟糕的模式設計。並重新設計可能是是更好的方法。

+0

純粹是學術性的。只是讓我想知道的事情。有趣的方法,雖然複製列,思維外框:) –