使用C#反复运行MongoDB查询并加快速度

时间:2013-07-19 13:28:38

标签: mongodb mongodb-.net-driver

我希望有人能给我一些关于这种奇怪的看法。我不知道是否有某种泄漏或我使用MongoDB的方式是古怪的错误。我从MongoDB CSharp ecosystem tutorial复制了一些代码。当我开始搞砸它时,我注意到执行查询的时间逐渐增加。我正在使用C#4.5,MongoDB 2.4.5,并运行Windows 7。

执行初始查询的时间大约为33毫秒,但随着循环的每次迭代,它逐渐增加。每次运行此代码时,查询时间从大约33毫秒开始,但增加到61毫秒。如果我使用ID,它将在15毫秒开始,并增加到34毫秒。我还尝试将Linq和本机EQ样式语法与Query对象一起使用,并且具有类似的增加结果。我希望每次迭代都能增加和减少时间,但不会不断增加。我是MongoDB的新手,这是我第一次看到它是2天前,所以任何洞察力,以找出正在发生的事情或我使用代码的方式有什么问题将不胜感激。 (为什么我这样做 - 我偶然发现同一个查询变得越来越慢并且好奇

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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

当然它会变慢,因为您需要在Name上对集合编制索引,因为您在collection.FindOne(query);字段上执行查询Name过滤。

答案 1 :(得分:0)

答案是我在Start()之前未调用Reset()而错误地使用了秒表。所以这实际上与MongoDB无关。