【发布时间】:2013-08-27 13:43:19
【问题描述】:
我第一次使用 MongoDB C# 驱动程序,我发现一些奇怪的性能结果。 当我查询一个包含 300 万条记录的集合时,排序和 .Take(1) 响应几乎是瞬时的(3 毫秒)。但是当我 .Take(2) 处理同一个查询时,最多需要 10 秒。 正确的索引已经到位,它是一个包含测试数据的非常简单的集合。
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
var database = server.GetDatabase("db_name");
var collection = database.GetCollection<MyType>("collection_name");
var query = from c in collection.AsQueryable<MyType>()
where c.SearchString.Contains(searchString)
orderby c.SearchString
select c.SearchString;
List<string> results = query.Take(2).ToList();
【问题讨论】:
-
我想知道为什么
take(1)很快:Contains()转换为正则表达式,而无根正则表达式查询不能使用索引,所以它们非常慢。你能提供explain()的结果吗? -
我从未使用过 MongoDB,但我的猜测是:
OrderBy+Take(1)被翻译成类似Max(或Min)的东西。 -
使用调试工具(不确定与 mongodb 有什么关系)查看在这两种情况下实际在数据库上执行的查询。如果有一个比另一个更有效的翻译(即,如果有一个操作需要第一个,但不是只需要两个,那么
Take(2)只是在 C# 应用程序中提取所有数据和过滤)那么这可能就是问题所在。 -
访问docs.mongodb.org/manual/tutorial/manage-the-database-profiler页面,如上所述,尝试分析您的查询,以便在数据库上执行实际查询。
-
尝试搜索集合中不存在的字符串。我敢打赌,Take(1) 在这种情况下会很慢。
标签: c# performance linq mongodb