zoukankan      html  css  js  c++  java
  • MongoDB 创建索引 及 Count查询 C#

    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    MongoDB 创建索引,需要引入第三方DLL文件:mongocsharpdriver ,这个可以通过NuGet来完成

    Mongodb 在百万条数据时,查询性能就会很低,我公司的数据库当数据量达到400万条数据时,查询大概需要10秒左右时间,这显然是不能接收的,那么我们通过建立MongoDB 索引来解决。

     目前公司的体量是近370万条数据,随着将来物联网设备的增加,那么将来很可能会突破上亿条。

    实战的结果是:加了索引后,查询性能显著提高,提高了几十倍,由原来的10秒变成了400毫秒不到。

    当然,如果你的数据表中只有很少的数据。例如十万条数据。或者十万级以下,在这种情况下建立索引对性能的提升不大显著。

    C# 建立索引代码如下:

            [Obsolete]
            public static void CreateBatteryHeartIndex()
            {
                var DatabaseName = new Battery2gHeartService().GetBatteryHeartDataBaseName();
                LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDb2gBatteryEnm.BatteryHeart2gData.ToString(), DatabaseName = DatabaseName };
                var client = new MongoClient(settings.ConnectionString);
    
                MongoDatabase mongoDatabase = client.GetServer().GetDatabase(settings.DatabaseName);
                var datacollection = mongoDatabase.GetCollection(settings.LogsCollectionName);
                var allindex = datacollection.GetIndexes();
                ///BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1
                if (!datacollection.IndexExistsByName("BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1"))
                {
                    var as_index = new IndexKeysBuilder();
                    as_index.Ascending("BatterySN");
                    as_index.Ascending("BmsStatus");
                    as_index.Descending("CreateTime");
                    as_index.Ascending("SOC");
                    datacollection.CreateIndex(as_index);
                }
    
            }

    执行上述代码,建立的索引如下:

    该方法针对建立的索引的命名规则为:名称加下划线加正序/倒序

    其中正序为1 倒序为-1

    因此:上述代码中的索引名称为:BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1

    除了建立查询索引,它还支持建立其他索引,譬如:唯一性索引:unique,等

    具体可参考:https://blog.csdn.net/chym18845095620/article/details/101033765  和 https://www.cnblogs.com/chenzibai/p/14719430.html

    下面简单看下MongoDB linq查询的计数问题

    这个没什么好说的,代码如下:

            public BaseResponse<ExbatModel> SearchExbatPercentage(ReadCabinetIotLogModel data)
            {
                CabinetIotLogModel cabinet = new CabinetIotLogModel();
                LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDbnameEnm.IotLogs.ToString(), DatabaseName = DatabaseName + DateTime.Now.ToString("yyyyMMdd") };
                if (!string.IsNullOrEmpty(data.TbDate))
                {
                    settings.DatabaseName = DatabaseNamePrefix + Convert.ToDateTime(data.TbDate).ToString("yyyyMMdd");
                }
                var client = new MongoClient(settings.ConnectionString);
                var database = client.GetDatabase(settings.DatabaseName);
    
                var Mongo = database.GetCollection<IotLogs>(settings.LogsCollectionName);
                ExbatModel model = new ExbatModel();
                model.TotalExbattRequest = Mongo.AsQueryable().Count(A => A.MethodName == "exbattrequest");
                model.SuccessExbatt = Mongo.AsQueryable().Count(A => A.MethodName == "exbatt" && A.Rst == 0);
                model.ExbattCmdFiled = Mongo.AsQueryable().Count(A => A.MethodName == "exbatt" && A.Rst != 0);
                return CommonBaseResponse.SetResponse<ExbatModel>(model,true);
            }

     计数Count的性能在此不多说。

    @天才卧龙的博客

  • 相关阅读:
    WP7备注(13)(独立储存)
    WP7备注(14)(ContentPropertyAttribute)
    WP7备注(11)(页面跳转)
    WP7备注(10)(Accelerometer+GeoCoordinateWatcher+Map Service)
    WP7备注(12)(页面数据共享)
    WP7备注(18)(OpacityMask)
    WP7备注(15)(Resources)
    WP7备注(19)(ImageBrush|VideoBrush)
    WP7备注(17)(TextBlock和Inlines)
    vmware 复制其他电脑的linux无法上网问题
  • 原文地址:https://www.cnblogs.com/chenwolong/p/15026544.html
Copyright © 2011-2022 走看看