【问题标题】:How to efficiently query MongoDB for documents when I know that 95% are not used当我知道 95% 没有使用时如何有效地查询 MongoDB 的文档
【发布时间】:2020-11-15 18:23:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能告诉我们更多关于数据的信息吗?理想情况下,您甚至可以立即在现有列上添加适当的索引。
  • 这种情况下当然索引是好的,没有索引,MongoDB必须进行一次集合扫描,可能会慢很多
  • 我知道索引以及如何使用它们。我的问题是如何利用我 95% 以上的数据实际上是“垃圾”这一事实来加速结果。 (不。我不能删除“垃圾”,因为我不知道什么是“垃圾”,什么不是)。只有经过几个月的实际生产工作,我才会知道使用了哪些文件。当然,可能会使用未使用的文档。

标签: mongodb query-performance


【解决方案1】:

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

  1. 如果您想重写/重构和重建应用程序的数据库。您可以使用版本控制模式。

它看起来怎么样?

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

相关文档/不相关文档。

基本上,您只能在 relevant 文档集合(存储 5% 的有用文档)上使用 find,如果没有,则使用 Irrelevant.find()。此模式将允许您存储旧/历史数据。并通过TTL indexcapped collection 进行管理。

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

This article 也可以提供帮助(与许多其他人一样,例如 this SO question

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

  1. 使用Indexes.explain()

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

是的,它将解决您的问题。看看download MongoDB Compass,在你的模式中创建这个boolean字段,(不要忘记添加默认值),索引该字段,然后使用Explain模块进行一些查询。但是不要忘记compound indexes! 如果您在一个索引上创建字段,请通过仅对这一字段进行查询来衡量性能。

结果应该是这样的:

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

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

实际上,所有这部分都可以在没有 Compass 本身的情况下通过 .explain.index 查询来完成。但是 Compass 对这个过程有更好的视觉效果,所以最好使用它。特别是因为他对所有人都完全免费。

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2017-09-13
    • 1970-01-01
    • 2021-10-30
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多