MongoDB批量导入及简单的性能优化
今天简单分享一下MongoDB使用过程中的一些性能优化,其实并不只适用MongoDB,其他数据库多少也可适用。
首先先随机导入一千万条数据。这里我分段导入的,因为mongo的BsonDocument一次导入的数据有限制,之前有一次最多导入20w左右,当然那次的对象字段要多很多,
所以本次测试每次导入为10w。咻咻咻咻咻咻咻咻咻咻的一声就导完了。
/// <summary>
/// 批量导入
/// </summary>
public void ImportBatch()
{
string[] nameArr = { "周", "吴", "郑", "王" };
string[] addressArr = { "浙江省杭州市", "浙江杭州", "浙江省杭州市滨江区", "北京", "上海", "广州", "深圳" };
int[] ageArr = { , , , , , , , , , , , , , , , };
int[] sexArr = { , };
//总条数一千万条
int count = ;
//每次导入
int size = ;
//分num次导入
var num = (int)Math.Ceiling((double)count / (double)size);
for (int i = ; i < num; i++)
{
//最后一批导入
List<BsonDocument> docs = new List<BsonDocument>();
for (int j = i * size; j < (i + ) * 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等处理方案。
具体就不多说了。
纸上得来终觉浅,绝知此事要躬行。
MongoDB批量导入及简单的性能优化的更多相关文章
- 亿级别记录的mongodb批量导入Es的java代码完整实现
针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用Es查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...
- MongoDB 性能优化五个简单步骤
MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracl ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
- 一次EF批量插入多表数据的性能优化经历
距离上次的博客已经有15个多月了,感慨有些事情还是需要坚持,一旦停下来很有可能就会停很久或者从此再也不会坚持.但我个人一直还坚持认为属于技术狂热份子,且喜欢精益求精的那种.最近遇到两个和数据迁移相关的 ...
- MongoDB学习笔记(四)--索引 && 性能优化
索引 基础索引 ...
- MongoDB性能优化
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...
- MongoDB性能优化指南
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...
- DedeCMS数据负载性能优化方案简单几招让你提速N倍
前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...
- MongoDB实战性能优化
1. 性能优化分类 mongodb性能优化分为软件层面和操作系统层面. 软件层面,一般通过修改mongodb软件配置参数来达到,这个需要非常熟悉mongodb里面的各种配置参数: 而操作系统层面,相对 ...
随机推荐
- 后台返回json可能会出现的异常解析:java.lang.IllegalStateException: WRITER
在使用filter做权限管理限制访问时,经常是在数据可以正确返回时,在后台日志中却有这个异常抛出,这个现象让人不禁想去一探究竟. 我要做的是在一个filter中拦截所有的请求,并且根据拿到的请求中的参 ...
- (转)java内部类详解
本文转自http://www.cnblogs.com/dolphin0520/p/3811445.html,谢谢作者 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能 ...
- android studio 使用adb命令传递文件到android设备
一:文件传输 在android开发中,有时候需要将文件从pc端传递至android,或者将软件运行的日志,从android设备传递到pc进行分析,我们可以使用windows的cmd窗口,或者andro ...
- 虚拟机修改静态ip
1.设置虚拟机的网络选择方式,使用NAT模式,选择这个模式后网段与主机的网段不是一个网段,一般选择桥接模式 2.选择VMnet8, 去掉 使用本地DHCP服务将ip分配给虚拟机 这个选项,不然设置ip ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- JavaWeb之Java Servlet完全教程(转)
Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...
- 串String(2):串的实现(堆分配存储表示法)
7/27/2017,先占个位,最近事情比较忙,明天敲一波代码,预测在一星期内搞定 9/02/2017,看到这个十分汗颜,八月去美帝学习了,没有抽空补上这一博文,计划这个月开了数据结构课后补上
- 使用puppet
首先配置一个默认文件 只是首次创建的时候才需要重启,后期不需要重启! [root@master manifests]# vim /etc/puppet/manifests/site.pp node d ...
- php通过system()调用Linux命令问题
最近在做php和linux crontab的联调,发现php在linux下的权限问题需要引起注意,调试问题的过程中发现有许多问题前人说的比较零散,我在这里汇总,顺带抛砖引玉一下. 1.$result= ...
- Android Weekly Notes Issue #288
Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...