我在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();
}
}
答案 0 :(得分:2)
我认为问题不在mongodb中,加载速度可能有两个原因:
为了提高速度,您可以:
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#驱动程序,但是如果在添加索引后仍然存在性能问题,请告诉我们。