2013-11-23 31 views
1

我需要在mongo集合preventti中重複插入1000項每分鐘。性能:findAndUpdate VS直接保存並刪除重複項

隨着findAndUpdate/Upsert服務器的性能下降很多。

保存項目不檢查重複服務器不會變慢,但我需要一個cronjob刪除所有重複的項目。

哪個是最好的方法來擴展呢?

  • 一臺機器高RAM?多少?
  • 許多機器具有副本集和更低的RAM?
  • 也許分片?
+0

你如何檢查它們是否重複? findAndUpdate調用的代碼是什麼樣的? – WiredPrairie

+0

什麼是findAndUpdate?在mongodb中沒有這樣的操作 - 是你自己的代碼嗎?可能在那裏效率低下。 –

+0

@AsyaKamsky - 我現在意識到他可能意思是'findAndModify'。 – WiredPrairie

回答

2

通過創建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。這將導致您的應用程序將文檔發送到數據庫而無需等待確認。

爲了解決您的其他建議:副本集不會提高寫入性能,因爲只有主節點可以接受寫入。但是,您可以通過設置分片羣集來提高寫入性能,因爲寫入將根據分片密鑰分佈在羣集成員上。

+0

與'findAndUpdate'相比,使用唯一索引會更快嗎?我從來沒有比較過這兩個。我認爲他們做了幾乎相同的事情(假設索引存在覆蓋'find') – WiredPrairie

+0

當你有一個合適的非唯一索引時,與findAndUpdate的差別可能會很小,但是如果沒有索引,findAndModify將不得不掃描整個集合找到重複,這可能需要一段時間,大集合。 – Philipp

+0

驚人的解釋,謝謝。我會發現更多關於寫關注和分片。謝謝! – Leabdalla