新年新技術:MongoDB 3.0
原文 http://jindong.io/2015/03/09/new-technique-in-new-year-mongodb3.0/
前一篇介紹了HTTP/2,這一篇簡單介紹下3月3號發布的MongoDB 3.0。
-
What’s new in MongoDB 3.0?
- 新的存儲引擎WiredTiger
- MMAPv1引擎的改進
- Explain
- 查詢API的改進
- 索引
- 工具
- 新的Java驅動
- 官方文檔
What’s new in MongoDB 3.0?
新的存儲引擎WiredTiger
MongoDB 3.0的存儲引擎是插件式的,默認為新增的 WiredTiger 。WiredTiger相比原來的MMAPv1引擎的優點:
- 文檔級別的鎖
這個改進真是盼望已久啊,一直以來MongoDB的鎖粒度都被人詬病,根據我們實際的經驗MongoDB在高并發的讀寫混合場景下性能很差。
- 更高的壓縮比
新的MongoDB使用了前綴壓縮 (Prefix Compression),大大提高了索引數據的壓縮比。從我們運維同事的簡單的測試結果來看很客觀:
- 寫性能提高
官方的說是提高了7-10倍,從我們簡單的測試結果看雖然沒有那么夸張但確實有不小提升:
我們2.x版本測試結果大概2w不到。
注意:WiredTiger只能用于64位的機器。
MMAPv1引擎的改進
雖然新增了WiredTiger,但是對原來的MMAPv1引擎也做了改進。
- 新的記錄分配策略
MongoDB 3.0使用 power of 2 allocation 代替原來的動態記錄分配,且棄用了 paddingFactor 。
原來的分配策略在文檔變大超過初始分配的大小的時候,MongoDB要分配一個新的記錄,并要移動數據和更新索引,導致存儲碎片。 power of 2 allocation
的策略是分配的記錄的大小都是2的次方(32, 64, 128, 256, 512 … 2MB),每個記錄包括文檔本身和額外的空間——padding,這個機制減少了文檔增長的時候記錄重新分配和數據移動的操作。
顯然新的策略在處理大文檔和文檔增長頻繁的場景下效率更高,但如果只有插入操縱和所謂的in-place更新操作(不會增長文檔大小)那么使用這種策略會很浪費空間,因此MongoDB 3.0允許你關閉這種策略。
- 集合級別的鎖
雖然沒有WiredTiger的鎖粒度小,但是相比之前MMAPv1還是挺重要的一個改進。
Explain
新增 Explain ,類似MySQL的查詢計劃,做性能調優的時候很有用處。
查詢API的改進
-
aggregate()新增$dateToString 操作符,支持將日志轉換為指定的格式
-
查詢新增 $eq 操作符支持相等判斷
索引
- 后臺創建索引時不會被dropDatabase,drop和dropIndexes操作中斷。
工具
主要是mongodump和mongorestore功能的改進。
新的Java驅動
簡單的看了下源碼,原來的API仍然兼容,但重寫了很多主要類(MongoCollection,MongoDatabase),新的 MongoIterable接口風格很像Java8的Stream,而且都是泛型的。 提供了異步的MongoClient,新的編碼框架,提高了性能。