我會先描述我的情況,以便儘可能清楚地說明下列問題。如何避免將重複項插入數據庫最有效的方法?
爲了簡單起見,讓我們說我有一個表中的MySQL數據庫(InnoDB的)有關於狗與結構記錄如下:
dog_id (PK) | dog_name
並且在表10,000,000行(每個代表一種獨特的狗)並在dog_name列上構建索引。
我的程序搜索需要處理的獸醫記錄。每條記錄都以某種方式與一條狗相連,每條狗有100條記錄。我想找到還沒有插入數據庫的狗。
這意味着連續100次正在處理的記錄可以是關於已經在數據庫中的狗,因此狗不必被添加到數據庫中。但有時候會發生(如前面提到的1:100比例),我需要向數據庫添加一條狗,因爲這是程序第一次接近關於狗的記錄。 (我希望這個例子使我的情況清楚)
我的問題是: 如何驗證狗沒有被插入到數據庫中的最有效的方式是什麼?
- 將所有狗的名字(假設世界上所有的狗都擁有唯一的名字)加載到程序的內存中(一組),並檢查狗是否在集合中。當它在集合中時,我跳過記錄,當它不在時,我插入狗。
- 將該列定義爲UNIQUE並嘗試插入所有記錄。當由於唯一性而導致數據庫錯誤時,我只需跳過該狗並繼續。
- 查詢數據庫以確定每次處理記錄時狗是否在數據庫中,如果它在數據庫中,我將跳過記錄,如果不是,則將狗插入表中。
給你儘可能多的信息,我可以。我使用Python,SqlAlchemy,MySQL,InnoDB。
我之前還不知道「ON DUPLICATE KEY」語法。謝謝。不過,我想「INSERT IGNORE INTO」對我來說會很有用。問題是,不會更快地SELECT + INSERT?考慮比率100:1(只有SELECT和SELECT後跟INSERT) – Marek
我不會推薦使用INSERT IGNORE,因爲這會忽略查詢中的任何錯誤,包括重複鍵。做一個'SELECT'然後一個'INSERT'會混合一些Python到SQL中,它並沒有被優化,並且可能比只執行INSERT ... ON DUPLICATE KEY' INSERT IGNORE'(純SQL) 。所以我建議使用INSERT ... ON DUPLICATE KEY。 – sundance