mysql 高效的去重插入數據

前言:

 我們最簡單的想法就是先查詢一下,看看這個對象有沒有在,如果在,就更新或者刪除,或者忽略,如果不在就插入,但是對於數據處理來說,這個可能就有點浪費性能了,而且我們學習的也是批量存儲比單一存儲要快,單一存儲30ms,批量存儲10個40ms,批量存儲越大,他們兩個的差距就越大,又有人提出了select in ,我們批量的去查詢,看看鍵在沒在我們批量數據的數組裏面,找到在的就忽略掉,確實時間可以快一點,但是處理麻煩,接下來,就要放大招了!

大招

mysql 有一個特性的存儲 ON DUPLICATE KEY UPDATE,有就update,沒有就更新,當然如果你想忽略就不在更新的地方寫東西不就行了,如果你想替換,就將所有的字段更新一遍

關於如何使用,什麼例子都不如官網https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

mysql語句會了,再來點配菜

peewee框架對該語句的支持http://docs.peewee-orm.com/en/latest/peewee/api.html#Insert.on_conflict

on_conflict 可以配置重複就更新

on_conflict_ignore 配置重複就忽略

on_conflict_replace 配置重複就替換

測試

9000行數據去重 800ms

44000行數據1-2s,

注意

數據量大了,mysql可能就有點’撐不住‘比如你可能會遇到大數據在存儲的時候出現錯誤MySQL server has gone away (BrokenPipeError(32, 'Broken pipe')),一般是因爲max_allowed_packet,客戶端和mysql服務器的傳輸字節數太小了,默認是4m,我一般會設置到100m,具體怎麼設,自己百度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章