2017-01-09 61 views
0

我有一個大表(500萬行),用所謂的唯一標識符列「UNIQUE_ID」使用MySQL唯一索引來防止重複,而不是重複搜索?

我正在通過Node.js的插入查詢(node-mysql綁定),並有一個機會,可以重複嘗試被插入。

兩個解決方案是:

1)製作 'UNIQUE_ID' 的指數,並檢查整個數據庫重複記錄,要插入之前:

'SELECT unique_id WHERE example = "'+unique_id+'" LIMIT 1' 

2)製作 'UNIQUE_ID' 一MySQL中的唯一索引,並執行INSERT 而不用檢查重複項。顯然,任何重複都會導致錯誤,並且不會被插入到表中。

我的預感是解決方案2)更好,因爲它可以防止重複搜索更糟糕的情況(500萬行)。

使用解決方案2)有什麼缺點嗎?

回答

1

還有就是要定義爲UNIQUE_ID列的唯一,主索引有許多優點:

  • 語義正確性 - 目前的名稱不能反映現實,你可以在列重複稱爲「UNIQUE_ID」,
  • 自動生成唯一ID - 您可以將此作業委託給數據庫並避免ID衝突(如果您使用的是UUID而不是整數),
  • 速度增益 - 成爲可靠的解決方案1將需要阻塞事務(在檢查重複之間不應插入新行美食和插入一行)。將其委託給MySQL將效率更高,
  • 遵循一個通用模式 - 這正是唯一的和主要的索引設計要做的。您的解決方案將易於向其他開發人員瞭解,
  • 代碼較少。

對於第二種解決方案,您可能需要處理嘗試插入重複項(除非您的唯一ID由MySQL生成)。

增量主索引: https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html

+0

謝謝,這是一個很好的答案 –

1

出人意料的是,這是毫無差別的性能代價。搜索將使用(並要求)相同的索引。

然而,性能差異很小的是(2)解決方案的優勢。

其實在MySQL中,你可以擺脫錯誤的完全使用Ignore關鍵字:

INSERT IGNORE INTO ... VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9)...; 

將始終成功(將跳過插入式兩份)。如上所述,這允許在單個語句中插入多個值。

您可能也有興趣在ON DUPLICATE KEY UPDATE家庭的技巧:-)。

真正的差異,正如M.M.已經陳述,在完整。使用UNIQUE索引約束,您可以確定數據;否則,您需要在檢查它和插入新元組的時刻之間鎖定表,以避免其他人插入相同值的風險。


你(1)解決方案,可以有一個地方,如果數據的「duplicateness」要求顯著業務邏輯的工作,不能很容易地轉換成MySQL的約束。在這種情況下,你會

  • 鎖表,
  • 搜索候選重複(說你讓他們的20),
  • 獲取數據並驗證它們是否真正的候選人
  • 插入新元組如果沒有衝突,則
  • 釋放該鎖。

(這可能是上好的理由理想的情況下認爲需要做這樣一個複雜的旋轉木馬輪從數據庫設計中的一些錯誤造成的。你應該能在MySQL做的一切。但是, 商業現實有時候有點偏離理想)。