MongoDB C#性能低下的问题

时间:2011-02-18 23:11:04

标签: performance mongodb mongodb-.net-driver

我在win64机器上测试MongoDB 1.6.5速度和C#。我使用Yahoo.geoplanet作为来源来加载州,县,城镇,但我的表现并不是很好。我目前有超过5秒的时间从这些源加载美国各州通过List传递到localhost中的网页。 仅使用id作为索引。有人可以建议表现方式。感谢

class BsonPlaces  
{  
   [BsonId]  
   public String Id { get; set; }  
   public String Iso { get; set; }  
   public String Name { get; set; }  
   public String Language { get; set; }  
   public String Place_Type { get; set; }  
   public String Parent_Id { get; set; }    
}  

public List<BsonPlaces> Get_States(string UseCountry)
{
   using (var helper = BsonHelper.Create())
   {
     var query = Query.EQ("Place_Type", "State");
     if (!String.IsNullOrEmpty(UseCountry))
       query = Query.And(query, Query.EQ("Iso", UseCountry));
     var cursor = helper.GeoPlanet.PlacesRepository.Db.Places
                  .FindAs<BsonPlaces>(query);
     if (!String.IsNullOrEmpty(UseCountry))
         cursor.SetSortOrder(SortBy.Ascending("Name"));
     return cursor.ToList();
   }
}

3 个答案:

答案 0 :(得分:2)

我认为问题不在mongodb中,加载速度可能有两个原因:

  1. 你试图加载大量的'BsonPlaces'(例如20000甚至更多)。
  2. 页面上的其他代码需要很长时间。
  3. 为了提高速度,您可以:

    1.设置查询将返回的项目的限制:

     cursor.SetLimit(100); 
    

    2.创建'Name','Iso','Place_Type'的索引:

    helper.GeoPlanet.PlacesRepository.Db.Places.EnsureIndex("Name");
    

答案 1 :(得分:2)

c#驱动程序可能存在很大的性能问题。在shell上进行100k次的简单查询需要3秒,相同的查询(用c#linq官方c#驱动程序1.5编写)需要30秒。 Profiler告诉来自c#client的每个查询花费不到1毫秒。所以我假设c#驱动程序正在做很多不必要的事情,这使得查询变得如此缓慢。

在mongodb 2.0.7下,操作系统:Windows 7,Ram:16G。

答案 2 :(得分:1)

我从Yahoo下载了GeoPlanet数据,发现geoplanet_places_7.6.0.tsv文件有5,653,969行数据。

这意味着在没有索引的情况下,您正在进行超过500万条目的“全表扫描”以检索美国50个州。

在查询某个国家/地区的州时,以下索引可能最有帮助:

... EnsureIndex(“Iso”,“Place_Type”);

不确定为什么你想要在没有指定国家的情况下搜索所有“州”,但是你需要另一个索引。

有时,当涉及排序时,索引匹配排序顺序可能是有利的。例如,由于您在“名称”上排序,索引可能是:

... EnsureIndex(“Iso”,“Place_Type”,“Name”);

然而,只有50个州,无论如何排序可能会非常快。

我怀疑你的任何慢速性能都归功于C#驱动程序,但是如果在添加索引后仍然存在性能问题,请告诉我们。