鍍金池/ 問答/數(shù)據(jù)庫/ mongodb,upsert的性能是不是隨著文檔數(shù)的增加而變得越來越差?

mongodb,upsert的性能是不是隨著文檔數(shù)的增加而變得越來越差?

upsert的性能是不是隨著文檔數(shù)的增加而變得越來越差?
那如果是insert呢?是不是就不會有上面的問題?
我現(xiàn)在有個寫多讀少的場景,如何保證寫入速度最優(yōu),且隨著集合里面數(shù)據(jù)越來越多,寫入速度不會變差?

謝謝

回答
編輯回答
尐飯團

upsert跟insert比,肯定是insert要好一些。因為upsert要先find是否存在,然后才insert,這是有額外開銷的。但是理論上不會有本質(zhì)的區(qū)別,因為B樹的時間復(fù)雜度是O(log2(N))——消耗時間不會隨數(shù)據(jù)量增長有明顯的增長:
clipboard.png

但是如果upsert的條件不能命中索引,那時間復(fù)雜度就是O(N),同樣在上圖中可以看到45度那條線,這就是時間跟數(shù)據(jù)量成正比了。

所以結(jié)論是:

  • 如果upsert的條件能夠命中索引,理論上跟insert的差異不會太大,也不會隨著數(shù)據(jù)量增長有明顯的變化趨勢;
  • 如果upsert的條件不能命中索引,花的時間就會隨數(shù)據(jù)量成正比增長。

理論歸理論,工程上你還得保證內(nèi)在足夠容納索引,否則與磁盤交換將極大地減慢索引搜索的速度。交換得越多,性能越差,這就會破壞O(log2(N))的曲線了

2017年2月27日 19:06