十年河东,十年河西,莫欺少年穷
学无止境,精益求精
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的性能在此不多说。
@天才卧龙的博客