繁体   English   中英

MongoDb C#驱动程序-通过索引字段获取项目非常慢

[英]MongoDb C# Driver - Get item by indexed field very slow

在小型本地数据库上获取过滤数据时,我遇到了性能问题。 我减少了代码(如下所示)以重现该问题。 输出约为2000ms。

一些其他信息:

  • 查询的集合包含135,000个条目,每个条目有7种简单类型
  • 在类似RoboMongo的查询中运行类似查询时-db.TickerData.find({_ id:ObjectId('5731d39062deb83134772e77')})。explain()-totalExecutionTime为<1ms
  • 我正在使用最新的MongoDb服务器和C#驱动程序版本
  • 数据库在同一开发/调试环境中本地运行(四核16Mb Ram)
  • 在除ID(始终为索引)之外的其他字段上进行测试时,我发现索引字段和未索引字段之间的性能没有差异
  • 不过,我的第一个操作是.Single()linq操作在执行单个搜索之前会检索所有文档,但是从Google看来,所有linq操作似乎都已转换为MongoDB服务器端查询

码:

public class UnitTest1
{
    public void TestMethod2()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        new BaseRepository<TickerData>().GetById("5731d39062deb83134772e77");
        sw.Stop();
        Debug.Write(sw.Elapsed.TotalMilliseconds);
    }
}

public class BaseRepository<T> : MongoBase where T : BaseEntity
{
    MongoDatabase DataBase { get; set; }
    protected IQueryable<T> Collection { get; set; }
    MongoCollection<BsonDocument> mCollection { get; set; }

    public BaseRepository()
    {
        DataBase = Server.GetDatabase("TradingBot");
        mCollection = DataBase.GetCollection<BsonDocument>(typeof(T).Name);
        Collection = mCollection.AsQueryable<T>();
    }

    public T GetById(string ID)
    {
        return Collection.Single(i => i.Id.ToString() == ID);
    }

}

更新:根据@rnofenko提出的建议(请参阅评论)取得了很大的进步,但似乎仍然很慢?

这是一个棘手的时刻。 您从System.Linq调用扩展方法Single 实际上,您是从数据库加载整个集合,然后在应用程序中按ID选择。

相反,您需要使用MongoDB扩展方法-MongoDB.Driver.Linq中SingleAsync

public async Task<T> GetById(string id)
{
    return await Collection.SingleAsync(x => x.Id == new ObjectId(id));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM