为什么我失去性能,如果我在MongoDB上使用LINQ
本文关键字:LINQ MongoDB 如果 失去 性能 为什么 | 更新日期: 2023-09-27 18:12:38
情况就是这样。我有一个域对象Product
,像这样…
[DataContract]
public class Product : IStorableEntity
{
[DataMember]
public String Id { get; set; }
[DataMember]
public String RemoteId { get; set; }
[DataMember]
public String LanguageId { get; set; }
[DataMember]
public DateTime? CreationDate { get; set; }
[DataMember]
public DateTime? LastUpdate { get; set; }
ETC..ETC...
}
到我的存储库层,我有以下方法:
public IEnumerable<TElement> Read()
{
var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
return mongoCollection.AsQueryable<TElement>();
}
使用这种方法,我想通过LINQ公开我的存储库层,而不导出有关技术的信息。
我可以这样做:
var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "1")
这个查询需要1或2毫秒。
相反……
var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "29000")
需要2800毫秒!!
我已经用命令
正确地创建了一个唯一索引 db.products.ensureIndex({"RemoteId":1, unique:true})
NB:是的,我也用.reIndex()
命令重建了索引
奇怪的是……
避免LINQ和修改…中的存储库方法public IEnumerable<TElement> Read(string remoteId)
{
var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
var query = Query<TElement>.EQ(p => p.RemoteId, remoteId);
return mongoCollection.Find(query);
}
如果我调用之前id相同的方法…
var _repository = new MyMongoRepository<Product>();
var result = _repository.Read("29000")
需要1或2毫秒。为什么? ?
为什么第一种方法的性能会随着id的增加而下降,而第二种方法不是这样吗?
p。嗯…
正如WiredPrainie在评论中所说,您应该使用IQueryable
而不是IEnumerable
,否则将检索整个集合。仔细阅读本指南http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/