MongoDB批量导入及简单的性能优化

baiyujing 2018-01-16 原文

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等处理方案。

具体就不多说了。

  纸上得来终觉浅,绝知此事要躬行。

 

发表于 2018-01-16 22:11 阅读() 评论() 编辑 收藏

 

版权声明:本文为baiyujing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/baiyujing/p/8299095.html

MongoDB批量导入及简单的性能优化的更多相关文章

  1. mongodb用mongoose查库的对象,不能增加属性

    node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mong […]...

  2. docker安装mongodb并备份

    安装 官方镜像地址: https://hub.docker.com/_/mongo?tab=descripti […]...

  3. MongoDB JAVA开发

    简介   MongoDB是一个基于内存的NoSql(非关系型数据库).具有NoSql的特点,读写快(key-v […]...

  4. 数据库索引结构知多少

    前几天在看 2018 云栖大会,来自中科院计算所的陈世敏研究员在“数据库内核专场”做了一场《NVM在数据库领域 […]...

  5. PICE(5):MongoDBStreaming – gRPC -MGO Service

      我在前面提到过MongoDB不支持像SQL般字符式的操作指令,所以我们必须对所有的MongoDB操作指令建 […]...

  6. 价值超10亿美元的直播系统架构图是什么样子的?

    写在前面 这几天公司项目赶进度,加班严重,真心累啊(贼TMD累)!今天不知道写啥,给小伙伴们分享下我经历的一个 […]...

  7. mongodb详解

    一.Nosql数据库的优缺点: 优点: 简单的扩展 快速的读写 灵活的数据模型 缺点: 不提供对sql的支持 […]...

  8. Ntaub表单开发入门系列 (一)

    此系列文章通过虚构场景介绍Ntaub表格开发流程。示例假设某公司人力部门要制定招聘计划,要求各部门按月提交招聘 […]...

随机推荐

  1. 推荐一个文献翻译软件–Deja Vu X

    首先我的这篇博客推荐的软件并非你觉得翻译精确度有多高的软件,假设是这种话就不用往下看了,免得浪费时间,仅仅是一 […]...

  2. 利用turtle绘画海龟画图

    1 import turtle #导入turtle 2 turtle.showturtle() #显示箭头 3 […]...

  3. 项目总结手机号+短信验证码登录 – 安卓笔记侠

    项目总结手机号+短信验证码登录 首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取 […]...

  4. 深度学习在美团搜索广告排序的应用实践 – 美团技术团队

    深度学习在美团搜索广告排序的应用实践 美团海量的用户与商家数据,广告复杂的场景下众多的影响因素,为深度学习方法 […]...

  5. pe文件被装入内存时按64k对齐 – 原来…

    pe文件被装入内存时按64k对齐 看罗云彬的win32汇编,看到搜索kernel32.dll基址问题的时候,有 […]...

  6. 转-ArcGIS Engine中的License设置

    AE开发中的License有两种方法进行设置,一种是通过LicenseControl控件,另一种是通过IAoI […]...

  7. 独立思考是自我意识觉醒的必要因素

    每个人都有自己的意识, 但是很多人没有意识到这一点. 一个人的周围都是对陌生人友好, 却总是辱骂, 殴打自己最 […]...

  8. IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法

    公司项目放在远程服务器上,之前都是将项目打包放上去运行后在log中查看相关调试信息,发现问题后在本地编辑器修改 […]...

展开目录

目录导航