我有一个包含 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());
输出是:
- 获取记录的时间:00:00:00.0059207
- 将 var 转换为列表的时间:00:01:00.7209163
- 列表中的总计数:1003154
我有几个与给定代码相关的问题。
- 当 line collection.Find(filt) 执行时,它是从数据库中获取过滤记录还是只是创建过滤器?
- var list1 = list.ToList();执行需要 1 分钟,是否只是从 var 转换为 list 或者先获取数据而不是转换?
- 如何在尽可能短的时间内完成此查询并获得结果。请帮忙。
最佳答案
When line collection.Find(filt) executes, does it fetch filtered record from the database OR Just creating filter?
它只是创建过滤器。
var list1 = list.ToList(); takes 1 minute to execute, is it only converting from var to list OR First fetching data than converting?
它正在获取数据并进行转换。
How to achieve this query and result in least possible time. Please Help.
数据库上的获取/过滤正在消耗您的时间。加快速度的最简单方法是在您要过滤的列上创建索引。
其他一切都需要更多的努力或数据库技术,例如创建一个更粗略地呈现您的日期的列(例如按天分组)并为此建立索引,或者创建类似按给定时间跨度分组的表部分之类的内容(我是我不是数据库管理员,也不知道正确的术语,但我记得有人在拥有数十亿条记录的数据库上这样做;) )
关于c# - 如何优化大型数据集上的 C# mongodb 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969848/