使用C#一遍又一遍地运行MongoDB查询,速度越来越慢



我希望有人能让我深入了解这个奇怪的地方。我不知道是否有某种泄漏,或者我使用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无关。

最新更新