我正在测试MongoDB及其正在进行的项目的c#客户端。我做了一些基准测试,对于我的测试,c#项目创建了一个简单的应用程序,它实例化10.000.000对象并将它们插入到MongoDB集合中。每个文档大约有10个字段。这些字段随机分配的值非常短(2或3个字符)或整数。
几分钟后,它成功存储了所有10.000.000文档。现在我使用mongo shell和提供的rest服务来做一些简单的查询。我正在搜索特定的字符串(例如' AAA'或BBB'),它花费了大约200-300毫秒并返回了10.000个结果(设置了一些限制)。创建索引后,它只需要最多20ms,这是我想要的性能,因为它将是一个读取繁重的应用程序。
到目前为止非常开心。然后我尝试在c#client中创建相同的查询,它总是需要至少200ms才能执行。即使多次调用同一个查询。
我已经在两个不同的系统上进行了测试。 - 一款是Intel xeon e5 1660 v3,配备48GB内存和企业级SSD - 第二个是i7,8GB的RAM和入门级SSD
目前,我在两台PC上都获得了相同的结果。
我知道第一个查询/连接可能代价高昂并需要一些时间,但我已经将相同的查询运行了50次并且它总是返回相同的结果 - 200 - 250ms范围
在两台机器上进行了一些测试后,我决定从头开始。我创建了一个简单的项目(附上下面的代码)。并尝试基于我插入的1000个结果进行查询。我得到了同样慢的查询时间。一个简单的'返回所有结果'查询需要250 - 300毫秒。即使在分配限制而只获取一个项目时也是如此。
我的插入代码:
_client = new MongoClient();
_database = _client.GetDatabase("search");
collection = _database.GetCollection<TestVote>("testVotes");
for (int i = 0; i < 1000; i++)
{
TestVote vote = new TestVote();
vote.postNumber = RandomString(2); // the id of the politician
vote.randomSeed = _rng.Next(0, 5000);
collection.InsertOneAsync(vote);
}
TestVote类:
class TestVote
{
public ObjectId Id;
public string postNumber;
public int randomSeed;
}
我的查询代码:
var watch = Stopwatch.StartNew();
//var filter = Builders<TestVote>.Filter.Eq("postNumber", "AA");
// ^ this only returns one results and still takes 300ms
//var result = await collection.Find(filter).FirstOrDefaultAsync();
var result = await collection.Find(_ => true).Limit(5).FirstOrDefaultAsync();
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine(elapsedMs + " " + result.postNumber);
我已经尝试了查询代码的注释部分以及相同的结果