我希望有人能让我深入了解这个奇怪的地方。我不知道是否有某种泄漏,或者我使用MongoDB的方式是错误的。我从MongoDB CSharp生态系统教程中复制了一些代码。当我开始处理它时,我注意到执行查询的时间逐渐增加。我使用的是C#4.5,MongoDB 2.4.5,运行的是Windows7。
执行初始查询的时间大约需要33毫秒,但随着循环的每次迭代,它会逐渐增加。每次运行此代码时,查询时间从大约33毫秒开始,但增加到61毫秒。如果我使用ID,它从15毫秒开始,增加到34毫秒。我还尝试在query对象中使用Linq和本机EQ风格的语法,并得到了类似的增加结果。我本以为时间会随着每次迭代而增加和减少,但不会不断增加。我对MongoDB还很陌生,第一次看到它是在两天前,所以如果能深入了解我使用代码的方式发生了什么或出了什么问题,我将不胜感激。(我为什么这么做——我碰巧注意到同一个查询越来越慢,并感到好奇)
using System;
using System.Diagnostics;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
namespace Snippets
{
public class Entity
{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase("test");
var collection = database.GetCollection<Entity>("entities");
var entity = new Entity { Name = "X" };
collection.Insert(entity);
var query = Query<Entity>.Where(e => e.Name == "X");
for (int i = 0; i < 100; i++)
{
sw.Start();
var item = collection.FindOne(query);
sw.Stop();
Console.WriteLine("{0:0} ms", sw.ElapsedMilliseconds);
}
collection.Remove(query);
}
}
}
当然会越来越慢,因为您需要在Name
上对集合进行索引,因为您在Name
字段上执行查询collection.FindOne(query);
筛选。
答案是我没有在Start()之前调用Reset(),从而错误地使用了Stopwatch。所以这实际上与MongoDB无关。