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

    具体就不多说了。

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

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/baiyujing/p/8299095.html
Copyright © 2011-2022 走看看