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 事务,复制和分片的关系

    摘要:本文尝试对Mongo的复制和分布式事务的原理进行描述,在必要的地方,对实现的正确性进行论证,希望能为Mo […]...

  2. MongoDB

    1.什么是MongoDB? 官网介绍:MongoDB is a document database with […]...

  3. MongoDB最佳安全实践

    在前文[15分钟从零开始搭建支持10w+用户的生产环境(二)]中提了一句MongoDB的安全,有小伙伴留心了, […]...

  4. mongoDB安装windows 64 bit

    mongoDB安装windows 64 bit   https://www.mongodb.org/downl […]...

  5. 快速掌握mongoDB(二)——聚合管道和MapReduce

      上一节简单介绍了一下mongoDB的增删改查操作,这一节将介绍其聚合操作。我们在使用mysql、sqlse […]...

  6. Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在 […]...

  7. (1)解锁 MongoDB replica set核心姿势

    副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-sla […]...

  8. 索引

    索引 1、什么是索引?有什么用? 索引相当于一本书的目录,通过索引可以快速的查找到相应的资源,缩小查找的范围 […]...

随机推荐

  1. Google Chrome 浏览器最新版本 71.0.3578.98(正式版本) (64 位)

    Google Chrome 浏览器 最新版本 71.0.3578.98(正式版本) (64 位) 链接地址:h […]...

  2. 查看电脑已经连过的wifi密码

    用下面两条命令可以完成    查看当前系统已经保存的网络 netsh wlan show profiles 查 […]...

  3. 微信小程序开发的基本流程

    微信小程序开发的基本流程 一,微信小程序简介 1,微信小程序简称小程序,张小龙在微信公开课 Pro 上发布的小 […]...

  4. ETL数仓测试

    前言 datalake架构 离线数据 ODS -> DW -> DM https://www.ji […]...

  5. x86\\x64\\ia64的区别

          这几天做MDT时,总是会遇到x86\x64\ia64这几个文件夹。前两者很常见,自从Win7系统出 […]...

  6. 在线时间加减计算器

    在线时间加减计算器 在线时间加减计算器 在线计算n秒前后,n分前后,n小时前后,n天前后,n周前后的时间,时间 […]...

  7. 中国大学排名爬虫

    功能描述: 输入:大学排名URL链接:http://www.zuihaodaxue.cn/zuihaodaxu […]...

  8. mysql之使用centos7实现主从复制(读写分离)的实现过程

    什么是主从复制? 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的 […]...

展开目录

目录导航