項目中使用到了mongdb,在小資料量時,和關係型資料庫一樣,看不出任何問題。當資料的操作變的頻繁,如對10萬級的資料表連續進行查詢操作,mongdb會變的非常緩慢。
到底是什麼原因呢?
這是spring版本的mongdb操作,spring的MongoTemplate只是對源生方法的一些封裝,如果spring環境下有這些問題,直接使用源生方法進行的資料操作也會產生同樣的問題。
下面是我的最佳化過程:
1.建立索引,索引對mongdb的查詢速度影響非常大,mongdb索引建立的方法網上有很多,我這裡舉一個實際的例子:
有個資料表叫Student,該表中name、age屬性被用作查詢條件,其中name被使用的頻率非常大,age在特定的地方會和name同時作為查詢條件,age幾乎不會單獨作為查詢條件。
索引建立過程如下:
db.Student.ensureIndex({ "name" : 1, "age" : -1 },{ "name" : "name_age_index" });
如果使用MongoVUE用戶端軟體的話,直接添加索引輸入:{ "name" : 1, "age" : -1 }即可。
最後記得建立索引後不要隨便drop表。
2.最佳化代碼,方法使用不當會顯著影響mongdb效能,這裡我列舉一下我的使用經驗:
a.單純的更新資料操作使用 mongoTemplate.updateFirst() 或者mongoTemplate.updateMulti()代替mongoTemplate.findAndModify();
b.單純的新增資料操作使用 mongoTemplate.insert()代替 mongoTemplate.save();
c.查詢1條資料使用 mongoTemplate.findOne()代替 mongoTemplate.find()後遍曆資料;
d.查詢資料時注意資料量,如果使用mongoTemplate.find()的結果集過大,如10萬100萬,則資料會積壓在記憶體中,這是非常危險的,盡量使用limit方法限制條數。
3.謹慎選擇是否使用mongdb,在我們的項目使用過程中,確確實實的發現一些問題。選擇使用Mongodb使要考慮伺服器配置,因為Mongodb對記憶體是無限貪婪的,如果只有2G記憶體的伺服器,還要運行其他服務等,部署Mongodb的話處理小資料量還是可以的,進行大量的資料處理是不適合的。在我看來使用NOSQL就是可以花最少的錢處理更多的資料量,並且對資料的安全性不是非常看重的情況,比如允許資料丟失,或者無法處理事務等情況。如果對資料安全性要求較高的情形下,建議謹慎考慮。