如何在大型数据库上优化C#mongodb查询?

时间:2017-07-07 11:38:11

标签: c# mongodb mongodb-query mongodb-.net-driver robo3t

我有一个拥有1亿条记录的数据库表。 Screen Shot is taken from Robomongo

表架构:There are 100 million records

当我运行以下代码时。我得到了结果,但需要大约1分钟才能完成。我需要优化查询以更快地获得结果。我到现在所做的就是这里。请告诉我实现优化结果的方法。

        var collection = _database.GetCollection<BsonDocument>("FloatTable1");

        var sw = Stopwatch.StartNew();
        var builder = Builders<BsonDocument>.Filter;
        int min = Convert.ToInt32(textBox13.Text);  //3
        int max = Convert.ToInt32(textBox14.Text);  //150
        var filt = builder.Gt("Value", min) & builder.Lt("Value", max);
        var list = collection.Find(filt);
        sw.Stop();
        TimeSpan time = sw.Elapsed;
        Console.WriteLine("Time to Fetch Record: " + time.ToString());


        var sw1 = Stopwatch.StartNew();
        var list1 = list.ToList();
        sw1.Stop();
        TimeSpan time1 = sw1.Elapsed;
        Console.WriteLine("Time to Convert var to List: " + time1.ToString());
        Console.WriteLine("Total Count in List: " + list1.Count.ToString());

Out Put是:

  • 获取记录的时间:00:00:00.0059207
  • 将var转换为List的时间:00:01:00.7209163
  • 列表总数:1003154

我几乎没有与给定代码相关的问题。

  1. 当line collection.Find(filt)执行时,是从数据库中获取过滤后的记录还是只创建过滤器?
  2. var list1 = list.ToList();执行需要1分钟,是否仅从var转换为列表或首先获取数据而不是转换?
  3. 如何实现此查询并最少花费时间。请帮忙。

1 个答案:

答案 0 :(得分:2)

  

当line collection.Find(filt)执行时,是否进行过滤   从数据库记录还是只创建过滤器?

它只是创建过滤器。

  

var list1 = list.ToList();需要1分钟才能执行,仅此而已   从var转换为列表OR首先获取数据而不是转换?

它正在获取数据并进行转换。

  

如何实现此查询并最少花费时间。请帮助。

数据库上的提取/过滤正在耗费你的时间。加快速度的最简单方法是在要过滤的列上创建索引。

其他一切都需要更多的努力或数据库技术,比如创建一个更粗略地显示您的日期的列(例如按天分组)并索引此一个,或创建类似于按给定时间跨度分组的表格部分(I&#39 ;我不是DB-Admin,也不知道这个的正确条款,但我记得有人在数据库上做了数十亿条记录;))