当我知道 95% 未被使用时,如何有效地查询 MongoDB 文档

How to efficiently query MongoDB for documents when I know that 95% are not used

我收集了大约 5 亿份文件。 每次执行查询时,我都会从该集合中收到一个或多个文档。假设每个文档都有一个计数器,每当从查询中返回该文档时,我都会将此计数器加 1。 运行 系统投入生产几个月后,我发现只有 5% 的文档的计数器大于 0(零)。也就是说,95%的文件都没有被使用。

我的问题是:基于 95% 的文档未被使用的事实,是否有一种有效的方法来安排这些文档以加快查询执行时间?

这种情况下的最佳做法是什么?

如果 - 例如 - 我将为每个名为“consumed”的文档添加另一个布尔字段并索引该字段。我能以某种方式改善查询执行时间吗?

~500M documents 这是一个相当可靠的数字,如果这是真的,那就太好了。所以这就是我如何看待问题的解决方案:

  1. 如果您想 re-write/re-factor 并重建应用程序的数据库。您可以使用版本控制模式。

它看起来怎么样?

假设您有两个集合(或者甚至两个数据库,如果您使用的是微服务架构)

相关文档/不相关文档。

基本上,您只能在 relevant 文档集合(其中存储了 5% 的有用文档)上使用查找,如果没有,则使用 Irrelevant.find()。此模式将允许您存储 old/historical 数据。并通过 TTL index or capped collection.

进行管理

您还可以向其中添加一些 Redis 魔法。 (其中使用了完全相同的逻辑),看看:

This article can also be helpful (as many others, like this SO question)

但不要试图用 Redis 替换 Mongo,而是将它们组合起来。

  1. 使用 Indexes.explain()

If - for example - I will add another boolean field for each document named "consumed" and index this field. Can I improve the query execution time somehow?

是的,它将解决您的问题。看一看,download MongoDB Compass, create this boolean field in your schema, (don't forget to add default value), index the field and then use Explain module with some query. But don't forget about compound indexes! 如果您在一个索引上创建字段,则通过仅查询该字段来衡量性能。

结果应该是这样的:

如果您的索引有使用(并且实际上加速),Compass 会显示给您。

要衡量查询的性能(使用和不使用索引),请使用 Explain 选项卡。

Actually, all this part can be done without Compass itself, via .explain and .index queries. But Compass got better visuals of this process, so it's better to use it. Especially since he becomes absolutely free for all.