Вопрос производительности о базе данных Mongo - PullRequest
0 голосов
/ 03 августа 2011

сегодня я протестировал базу данных Mongo, но у меня возникла проблема с производительностью.После того, как я вставил 1.800.00, я попытался сделать сумму всех значений, но это тоже 57 с.Затем я попробовал то же самое в MSSQL и взял 0s !!

Можете ли вы дать какие-либо советы, что я делаю неправильно?Это ограничение по манго?

    static void Main(string[] args)
    {
        //Create a default mongo object.  This handles our connections to the database.
        //By default, this will connect to localhost, port 27017 which we already have running from earlier.
        var connStr = new MongoConnectionStringBuilder();
        connStr.ConnectTimeout = new TimeSpan(1, 0, 0);
        connStr.SocketTimeout = new TimeSpan(1, 0, 0);
        connStr.Server = new MongoServerAddress("localhost");
        var mongo = MongoServer.Create(connStr);

        //Get the blog database.  If it doesn't exist, that's ok because MongoDB will create it 
        //for us when we first use it. Awesome!!!
        var db = mongo.GetDatabase("blog");

        var sw = new Stopwatch();
        sw.Start();
        //Get the Post collection.  By default, we'll use the name of the class as the collection name. Again,
        //if it doesn't exist, MongoDB will create it when we first use it.
        var collection = db.GetCollection<Post>("Post");
        Console.WriteLine(collection.Count());
        sw.Stop();
        Console.WriteLine("Time: " + sw.Elapsed.TotalSeconds);

        sw.Reset();
        sw.Start();
        var starting = collection.Count();
        var batch = new List<Post>();
        for (int i = starting; i < starting + 200000; i++)
        {
            var post = new Post
            {
                Body = i.ToString(),
                Title = "title " + i.ToString(),
                CharCount = i.ToString().Length,
                CreatedBy = "user",
                ModifiedBy = "user",
                ModifiedOn = DateTime.Now,
                CreatedOn = DateTime.Now
            };
            //collection.Insert<Post>(post);
            batch.Add(post);
        }
        collection.InsertBatch(batch);
        Console.WriteLine(collection.Count());
        sw.Stop();
        Console.WriteLine("Time to insert 100.000 records: " + sw.Elapsed.TotalSeconds);

        //var q = collection.Find(Query.LT("Body", "30000")).ToList();
        //Console.WriteLine(q.Count());

        sw.Reset();
        sw.Start();
        var q2 = collection.AsQueryable<Post>();
        var sum = q2.Sum(p => p.CharCount);
        Console.WriteLine(sum);
        sw.Stop();
        Console.WriteLine("Time to sum '" + q2.Count() + "' Post records: " + sw.Elapsed.TotalSeconds); //PROBLEM: take 57 to SUM 1.000.000 records

}}

1 Ответ

2 голосов
/ 03 августа 2011

Ошибка производительности в следующем ряду:

var q2 = collection.AsQueryable<Post>();

В строке выше вы загружаете все записи из коллекции сообщений в память, поскольку драйвер не поддерживает linq. В MSSQL это занимает меньше секунды из-за linq и вычисления пройдут через базу данных. Здесь я думаю, что почти все 57 секунд нужно загрузить данные в память.

В mongodb для достижения максимальной производительности вам нужно создавать дополнительные поля (нормализовать данные) и вычислять любые суммы, счетчики и т. Д., Когда это возможно. Если это невозможно, вам нужно использовать map / Reduce или доступные агрегатные функции, такие как group (хорошо подходит для вашего примера расчета суммы).

...