十年河東,十年河西,莫欺少年窮
學無止境,精益求精
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的性能在此不多說。
@天才卧龍的博客