簡體   English   中英

隨着時間的推移,Mongodb的性能會隨着時間顯着降低。

[英]Mongodb performance degrades significantly over time with upsert.

我現在正在使用Mongodb作為緩存。 該應用程序將在夜間接收3個CSV,並且CSV會變大,因為將一直添加新產品。 目前,我已達到500萬條記錄,並且花了大約2個小時來處理所有內容。 由於緩存每天都會刷新,因此刷新數據變得不切實際。

例如

CSV 1
ID, NAME
1, NAME!

CSV 2
ID, DESCRIPTION
1, DESC

CSV 3
ID, SOMETHING_ELSE
1, SOMETHING_ELSE

該應用程序將讀取CSV 1並將其放入數據庫中。 然后,如果有新信息,將讀取CSV 2,它將添加到同一文檔或創建新記錄。 CSV 3適用相同的邏輯。因此,一個文檔將從不同的CSV獲得不同的屬性,因此upsert 完成所有操作后,所有文檔都將成為索引。

目前,前100萬個文檔相對較快,但隨着時間的推移,性能會大大降低。 我猜這是因為upsert,因為Mongodb必須找到文檔並更新屬性,否則創建它。 我正在使用Java驅動程序和MongoDB 2.4。 無論如何,我可以改善,甚至可以在mongodb java驅動程序中進行批量增補嗎?

“一切完成后,所有文檔都將被索引”是什么意思? 如果是因為您要添加其他索引,那么最后還是可以這樣做,但這很好。 如果絕對沒有索引,則可能是您的問題。

您要確保正在執行的所有插入/插入操作都使用索引。 您可以運行一個命令並使用.explain()來查看索引是否被正確使用。 您需要一個索引,否則每次插入/更新都要掃描100萬個文檔。

另外,您還可以提供有關您的應用程序的更多詳細信息嗎?

  1. 您將只分三個階段進行一次導入,還是會進行頻繁更新?
  2. CSV2和CSV3會修改大部分文檔嗎?
  3. CSV2和CSV3的修改是否添加或替換了文檔?
  4. 您的文件平均大小是多少?

假設您多次對同一文檔進行很多更新。 例如,CSV2和CSV3對同一文檔進行了更新。 您可能只想將文檔保存在應用程序的內存中,將所有更新應用到內存中,然后將您的文檔推送到數據庫中,而不是為CSV1導入,對CSV2進行更新,然后對CSV3進行另一組更新。 假定您有足夠的RAM來執行該操作,否則將再次使用該磁盤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM