zoukankan      html  css  js  c++  java
  • 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等处理方案。

    具体就不多说了。

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

  • 相关阅读:
    随想13:论“善”字
    Nginx做前端Proxy时TIME_WAIT过多的问题
    HTTP的长连接和短连接
    nginx长连接的问题
    Tomcat性能参数设置
    Nginx1.1.4+ 对后端机器的长连接特性
    HTTP长连接200万尝试及调优方法
    NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
    CRtmpServer转推流到Nginx Rtmp及SRS(SimpleRtmpServer)的经历
    rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)
  • 原文地址:https://www.cnblogs.com/baiyujing/p/8299095.html
Copyright © 2011-2022 走看看