MongoDB批量导入及简单的性能优化
MongoDB批量导入及简单的性能优化
今天简单分享一下MongoDB使用过程中的一些性能优化,其实并不只适用MongoDB,其他数据库多少也可适用。
首先先随机导入一千万条数据。这里我分段导入的,因为mongo的BsonDocument一次导入的数据有限制,之前有一次最多导入20w左右,当然那次的对象字段要多很多,
所以本次测试每次导入为10w。咻咻咻咻咻咻咻咻咻咻的一声就导完了。
/// <summary> /// 批量导入 /// </summary> public void ImportBatch() { string[] nameArr = { "周", "吴", "郑", "王" }; string[] addressArr = { "浙江省杭州市", "浙江杭州", "浙江省杭州市滨江区", "北京", "上海", "广州", "深圳" }; int[] ageArr = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }; int[] sexArr = { 0, 1 }; //总条数一千万条 int count = 10000000; //每次导入 int size = 100000; //分num次导入 var num = (int)Math.Ceiling((double)count / (double)size); for (int i = 0; i < num; i++) { //最后一批导入 List<BsonDocument> docs = new List<BsonDocument>(); for (int j = i * size; j < (i + 1) * size; j++) { var user = new User() { Name = GetStrRandomNumber(nameArr) + j, Age = GetIntRandomNumber(ageArr), Address = GetStrRandomNumber(addressArr), Sex = GetIntRandomNumber(sexArr), }; var json = JsonHelper.SerializeObject(user); BsonDocument document = BsonDocument.Parse(json); docs.Add(document); } //导入mongodb mongoServer.ImportBatch(collName, docs); } } /// <summary> /// 随机获取int数组的值 /// </summary> /// <param name="a"></param> /// <returns></returns> static int GetIntRandomNumber(int[] a) { Random rnd = new Random(); int index = rnd.Next(a.Length); return a[index]; } /// <summary> /// 随机获取string数组的值 /// </summary> /// <param name="a"></param> /// <returns></returns> static string GetStrRandomNumber(string[] a) { Random rnd = new Random(); int index = rnd.Next(a.Length); return a[index]; } /// <summary> /// 批量导入 /// </summary> /// <param name="collectionName"></param> /// <param name="docs"></param> public void ImportBatch(string collectionName, List<BsonDocument> docs) { var collection = database.GetCollection<BsonDocument>(collectionName); collection.InsertMany(docs); }
然后进行测试,先去看下索引db.getCollection(‘users’).AgetIndexes(),可以看到主键_id是索引
然后随便找一条数据测试。
可以看到用主键_id(0.002s)性能比Name(5.638)明显快很多。然后给Name建立个索引,然后再用Name(0.042)做搜索条件。
再测试下Age字段,用Age倒序排,取前100条。
建立索引之后。db.getCollection(‘users’).ensureIndex({“Age”:-1})
上面主要测试索引的效率。当然要避免“$nin”,模糊查询等一系列全文档扫描的查询条件,会很影响效率
如果就要通过地址字段模糊查询,那样也可以根据地址进行分库,分表的处理,可以根据数据量大热门城市建立user_beijing,user_shanghai,user_hangzhou等处理方案。
具体就不多说了。
纸上得来终觉浅,绝知此事要躬行。