我需要在mongo集合preventti中重複插入1000項每分鐘。性能:findAndUpdate VS直接保存並刪除重複項
隨着findAndUpdate/Upsert服務器的性能下降很多。
保存項目不檢查重複服務器不會變慢,但我需要一個cronjob刪除所有重複的項目。
哪個是最好的方法來擴展呢?
- 一臺機器高RAM?多少?
- 許多機器具有副本集和更低的RAM?
- 也許分片?
我需要在mongo集合preventti中重複插入1000項每分鐘。性能:findAndUpdate VS直接保存並刪除重複項
隨着findAndUpdate/Upsert服務器的性能下降很多。
保存項目不檢查重複服務器不會變慢,但我需要一個cronjob刪除所有重複的項目。
哪個是最好的方法來擴展呢?
通過創建unique index可以自動清除重複項。
例如:當您想拒絕的文件時,已經是FIRST_NAME和姓氏的組合相同的文檔,你會創建這樣一個索引:在您的收藏
db.addresses.ensureIndex({ "first_name": 1, "last_name": 1 }, { unique: true })
當你已經有重複並希望他們得到清除,當您創建索引,還需要設置dropDups選項:
db.addresses.ensureIndex({ "first_name": 1, "last_name": 1 }, { unique: true, dropDups:true })
爲了做大規模插入時進一步提高性能,你可以寫關注設爲w: 0
。這將導致您的應用程序將文檔發送到數據庫而無需等待確認。
爲了解決您的其他建議:副本集不會提高寫入性能,因爲只有主節點可以接受寫入。但是,您可以通過設置分片羣集來提高寫入性能,因爲寫入將根據分片密鑰分佈在羣集成員上。
與'findAndUpdate'相比,使用唯一索引會更快嗎?我從來沒有比較過這兩個。我認爲他們做了幾乎相同的事情(假設索引存在覆蓋'find') – WiredPrairie
當你有一個合適的非唯一索引時,與findAndUpdate的差別可能會很小,但是如果沒有索引,findAndModify將不得不掃描整個集合找到重複,這可能需要一段時間,大集合。 – Philipp
驚人的解釋,謝謝。我會發現更多關於寫關注和分片。謝謝! – Leabdalla
你如何檢查它們是否重複? findAndUpdate調用的代碼是什麼樣的? – WiredPrairie
什麼是findAndUpdate?在mongodb中沒有這樣的操作 - 是你自己的代碼嗎?可能在那裏效率低下。 –
@AsyaKamsky - 我現在意識到他可能意思是'findAndModify'。 – WiredPrairie