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

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

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

謝謝

回答
編輯回答
尐飯團(tuán)

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

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

所以結(jié)論是:

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

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

2017年2月27日 19:06