時間:2024-03-09 11:51作者:下載吧人氣:17
這里總結下這段時間使用mongo的心得,列出了幾個需要注意的地方。
1. 系統參數及mongo參數設置
mongo參數主要是storageEngine和directoryperdb,這兩個參數一開始不選定后續就無法再更改。
directoryperdb主要是將數據庫分文件夾存放,方便后續的備份及數據遷移。
storageEngine(存儲引擎)默認使用的是MMAPv1,推薦使用3.0新加入的引擎wiredTiger。經實際使用wiredTiger占用的磁盤空間是MMAP的1/5,索引大小是其1/2,查詢速度也提高很多,更重要的是該引擎提供了document級別的鎖,當集合插入或更新數據時不需要阻塞讀操作了。唯一的問題是市面上支持該引擎查詢的工具不多,MongoVUE無法查到該引擎存儲的集合,NosqlManager-mongo可以查到但需要.net環境支持。個人覺得熟悉下mongo command用mongo shell就足夠了,所以還是強烈推薦使用wiredTiger引擎。
2. 無需對集合進行水平切分
由于之前一直使用關系型數據庫,關系型數據庫當單表數據量超大時經常使用的一直方法是對數據表進行分表。在使用mongo時便很自然的覺得這招仍然有用。由于該系統的分表都是動態生成的,做到后面發現這招對mongo帶來的性能提升遠遠抵不過維護成本的增加。
分析一下關系型數據庫分表會提高性能的最大原因是很多關系型數據庫一張表是一個文件,分表可以避免一個文件過大所造成數據提取速度變慢。但是mongo并不是這樣存儲的,所以這條并不成立了。
用過的都知道mongo對索引的依賴非常大,如果集合不能一開始就設計好,那后續索引就得寫腳本來創建。這里貢獻個給mongo大表動態創建索引的腳本:
eval(function () {
var infos = [];
var collNames = db.getCollectionNames();
for (var i = 0; i < collNames.length; i++) {
var collName = collNames[i];
var collSize = db.getCollection(collName).count();
if (collSize > 1000000 && collName.indexOf(“info_”)==0) {
db.getCollection(collName).ensureIndex({publishDate:-1,blendedScore:-1,publishTime:-1,isRubbish:1},{name:”ScoreSortIdx”,background:true});
db.getCollection(collName).ensureIndex({similarNum:-1,publishTime:-1,isRubbish:1},{name:”HotSortIdx”,background:true});
db.getCollection(collName).ensureIndex({publishTime:-1,isRubbish:1},{name:”TimeSortIdx”,background:true});
infos.push(“name:” + collName + “索引創建成功”);
}
}
return infos;
}());
網友評論