我只想將唯一記錄添加到數據庫表中。有沒有辦法做到這一點,而不必做選擇來查看當前記錄是否已經存在,因爲隨着表的增長,這將非常耗時。我接受所有類型的建議(如果存在)。如何僅以可擴展的方式向數據庫添加唯一記錄
此外,作爲一種可能的替代方案,可能有一些索引選項可以使這些選擇更快,或者可以按照使select語句執行速度更快的方式對數據進行排序。
我正在使用MySQL和Java。
我只想將唯一記錄添加到數據庫表中。有沒有辦法做到這一點,而不必做選擇來查看當前記錄是否已經存在,因爲隨着表的增長,這將非常耗時。我接受所有類型的建議(如果存在)。如何僅以可擴展的方式向數據庫添加唯一記錄
此外,作爲一種可能的替代方案,可能有一些索引選項可以使這些選擇更快,或者可以按照使select語句執行速度更快的方式對數據進行排序。
我正在使用MySQL和Java。
有兩種可能性。
哪個更好取決於相對概率。
這是一個很好的解決方案。 – Ankur 2010-07-30 03:47:19
有人將不得不執行檢查,除非您可以從數據中推斷出它是否已經存儲過,如果可能取決於數據和用例。
鑑於有人不得不做檢查,爲什麼不讓數據庫檢查它呢?它會檢查它的唯一索引(你有一個唯一的索引並強制執行,對嗎?),如果記錄已經存在,則返回一個錯誤。
IOW,只是嘗試插入並捕獲任何產生的錯誤,如果錯誤是重複鍵錯誤,則跳過該記錄。
最簡單的方法是讓數據庫實施唯一性(爲索引設置的唯一鍵很可能會很好),因此任何重複都會被拒絕。您的代碼然後需要忽略拒絕消息。
您可能會將數據加載到tmp表中,而不是從該表中加載所有tmp.id!= id結果,然後截斷tmp。
如果插入事務不那麼重要,您可以創建一個唯一的約束。
爲了更快地訪問,只需創建一個私鑰,這將爲您的表創建一個聚簇索引。訪問時間會非常快。
謝謝你將看看這些想法 – Ankur 2010-07-28 09:21:24
看來答案一般會是NO。所以謝謝,這也有幫助,知道什麼是不可能的。 – Ankur 2010-07-28 09:10:40
從你的評論到Vinko的回答,我假設你想阻止必須將數據轉換爲記錄格式?雖然它不會幫助你解決你最初的問題,但是如果你用最近插入的記錄的標識數據在內存中保存一個HashSet,它可能會有所幫助。這允許您跳過最近插入數據的選擇,這可能是流量的90%,具體取決於您的應用程序行爲。如果在該組中找不到數據,則需要執行選擇以確保。 – rsp 2010-07-28 09:27:10
是的,這會有所幫助。 – Ankur 2010-07-28 09:31:16