首页 > 解决方案 > Parse-Server 源 _rperm 和 _wperm mongo 查询,我应该索引它们吗?

问题描述

我正在浏览我的 mongo 日志来为我的未索引查询添加索引。默认情况下,mongo 只记录需要超过 100 毫秒才能完成的查询。

我发现我在 _wperm 和 _rperm 键上有几个。我看到这就是 ACL 被分解的方式。但是什么类型的 Parse.Query 调用可能会在日志中创建这样的查询?

query: { orderby: {}, $query: { _rperm: { $in: [ null, "*", "[UserId]" ] } } }

我什至注意到这个查询是在一个只有 8 个对象的类上完成的,但需要 133 毫秒才能完成,这对于这么小的类来说似乎真的很慢,即使它必须进行内存排序和扫描。

我应该在代码级别解决这个问题,修改我的查询以避免这种类型的 mongo 查询吗?或者我应该为这些类型的查询添加索引?

我注意到我也有一些显示在 mLab 的慢查询选项卡中。查询看起来像{"_id":"<val>","_wperm":{"$in":["<vals>"]}},带有建议的索引{"_id": 1, "_wperm": 1},但它有以下注释:

"_id" 在现有的 {"_id": 1} 唯一索引中。以下指数建议仅在某些情况下是必要的。

然而,这是我较慢的查询之一,需要 320 毫秒才能完成。它在 _User 类上。这仅仅是因为 _User 类有很多行吗?由于 _id 是唯一的,我觉得添加 _wperm 索引应该不会有什么不同,因为我最终只有一个对象。

我很好奇我是否会看到对这些查询采取行动的好处,或者我是否应该安全地忽略它们。

标签: mongodbparse-server

解决方案


您应该按照 mongodb 的建议索引您的集合。在过去的 parse.com 时代,这些索引是根据看到的工作负载自动创建的。现在您需要创建它们。两者都有道理。在没有 masterKey 的情况下运行的每个查询都会命中 _rperm。每次写入中的 _wperm。将来,我们可以自动创建 _id + _wperm 索引,因为所有写入都使用该索引


推荐阅读