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的性能在此不多說。

@天才卧龍的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM