C# Unity博弈中的MongoDB性能问题

C# Unity博弈中的MongoDB性能问题,c#,mongodb,performance,linq,unity3d,C#,Mongodb,Performance,Linq,Unity3d,我们决定在我们的游戏中使用mongo db作为实时数据库,但搜索结果的性能是不可接受的。这些是包含15000个文档和17个字段(字符串、int、float)的测试结果 有没有其他方法可以使用C#.Net 2.0在mongo中进行快速搜索。我们想根据用户的得分来获得玩家的排名,并对他们进行排名。为了说明这一点,我已经有好几年没有成为.NET开发人员了,所以如果c#driver出现问题,我就无法发表评论,但我对Mongo有很好的了解,希望我能帮上忙 索引 索引将在这里对您有很大帮助。当您对未编制索引

我们决定在我们的游戏中使用mongo db作为实时数据库,但搜索结果的性能是不可接受的。这些是包含15000个文档和17个字段(字符串、int、float)的测试结果


有没有其他方法可以使用C#.Net 2.0在mongo中进行快速搜索。我们想根据用户的得分来获得玩家的排名,并对他们进行排名。

为了说明这一点,我已经有好几年没有成为.NET开发人员了,所以如果c#driver出现问题,我就无法发表评论,但我对Mongo有很好的了解,希望我能帮上忙

索引

索引将在这里对您有很大帮助。当您对未编制索引的字段进行排序和筛选时,这只会在数据库变大时给您带来问题

索引是特定于方向的(升序/降序)。这意味着您的“分数”字段应按降序索引:

db.player.ensureIndex({'Score': -1}) // -1 indicating descending
查询

而且,Mongo真的很棒(在我看来),而且看起来你并不是在利用它来发挥它的最佳能力

您的第一个电话:

var ranks = collection.FindAll().AsQueryable().OrderByDescending(p=>p.Score).ToList().FindIndex(FindPlayer).Count();
似乎(这是我的.NET知识可能让我失望的地方)您正在检索整个集合
ToList()
,然后在内存中过滤它(
FindPlayer谓词
),以便检索数据的子集。我相信这将评估应用程序内存中的整个游标(15000个文档)

您应该更新您的查询,以便Mongo执行工作,而不是应用程序

考虑到您的其他查询正在筛选
分数
,如上所述添加索引将显著提高这些其他查询的性能

评测

如果从mongo cli运行时预期进行的调用的行为与预期的一样,则可能是驱动程序正在进行稍微不同的查询

在mongo CLI中,首先需要设置配置文件:

db.setProfilingLevel(2)
然后,可以查询配置文件集合以查看实际进行的查询:

db.system.profile.find().limit(5).sort({ts: -1}).pretty()

这将向您展示最近的5个调用。

我不熟悉有关DB的这一部分,但可能使用API来提供这些信息?因此,您只需调用一个页面,服务器就会获取该页面。您可以提供您的集合索引吗?它可能有助于诊断problemOnly 1索引,即ObjectId字段。嘿,如果可能的话,尝试使用redis作为您的需求,因为它更适合您的需求,我建议将其作为一种替代方法,我建议除了制作流程之外还使用它fast@abhi谢谢你的建议。我会看一下。只要你调用.ToList(),它就会评估内存中任何延迟加载项,所以我认为你的假设是正确的correct@justcompile是的,你是对的。我们在生产代码中不使用.ToList(),它仅用于测试目的。在创建了一个索引来评分之后,我会用第三种方法调用同一个查询吗?我只是创建索引,然后尝试查找如下的查询:var pla=query.EQ(“UserID”,PlayerInfos.UserID);PlayerFields rPlayer=playerData.PlayerInfo.Find(新查询文档(“UserID”,playerFos.UserID)).First();但它让我兴奋5000毫秒。我不明白mongodb到底怎么了。这些返回时间非常慢!!您是否尝试直接对mongo运行查询?如果可以在游标上使用“explain”方法调试调用,以了解查询的执行情况。e、 g db.player.find({userid:123})。explain(true)它将告诉您是否正在使用索引和其他有用的索引things@justcompile当我尝试获取索引时,成功返回我以前创建的索引。但是在explain log indexFilterSet中:false。在蒙哥,一切都很好。。。
var ranks = collection.FindAll().AsQueryable().OrderByDescending(p=>p.Score).ToList().FindIndex(FindPlayer).Count();
db.setProfilingLevel(2)
db.system.profile.find().limit(5).sort({ts: -1}).pretty()