【问题标题】:With MongoDB, should I spilt a big collection into smaller ones?使用 MongoDB,我应该将大集合拆分成较小的集合吗?
【发布时间】:2016-04-14 18:53:35
【问题描述】:

假设我有一个包含这样文档的集合:

{
    category_id : 5
    data : (some data)
    (more data...)
}

我有 15 个类别,每个类别有 100 万条记录。因此,我在这个集合中有 1500 万个文档。

我不做非常复杂的查询。大多数情况下,我通过以下方式从 n 类中获取一些文件:

db.collection.find({category_id: n, (some other conditions) })

我想知道是否最好将此主集合拆分为 15 个集合,以便每个集合仅包含属于某个类别的文档。然后我不需要在查询中指定category_id,而是使用该类别的相应集合:

db.collection.find({ (some conditions) })

这是否会使查询速度更快并且有任何顾虑?

【问题讨论】:

  • 这个问题很广泛,但我会尝试列举我想到的。如果您可以识别出一些经常性的查询,则意味着您可以识别出清晰的用例。例如,如果您有时执行诸如 (cond1 cond2 cond3) 之类的查询,有时执行诸如 (cond4 cond5 cond6) 之类的查询,这意味着您可以将记录拆分到不同的集合中。当然,一个重要的问题是您是否总是想检索完整的文档。如果不是,则表明可能需要拆分您的记录。我猜,您也尝试添加索引。
  • 如果您不认为这是您的情况(事实上您可以拆分为不同的集合),那么您可能会对分片感兴趣,这基本上是在任意键上拆分您的记录! (docs.mongodb.org/manual/sharding)
  • @LouisF。我认为您的第一条评论几乎描述了我需要知道的内容。如果你能详细说明一下,那就是答案。例如,添加索引会比拆分更好吗?我知道它有点宽泛,但你提到的正是我想要的。谢谢。
  • 如果您没有任何索引,我会考虑使用索引来产生良好的性能。你必须知道索引是有代价的,你不能索引所有的字段。拆分和索引可能很合适!

标签: mongodb


【解决方案1】:

让我们考虑以下示例。我们有一个具有以下架构的用户(没有任何意义):

{
"id":123
"posts" : [...],
"favorites" : [...],
"settings" : {},
"followers" : [...],
"email" : "anyEmail@email.com",
"age" : 29
}

一方面,如果您有时按“收藏夹和关注者”之类的组查询字段,但您对其他字段不感兴趣,则可以将这些字段提取到单独的集合中并进行专门的查询。这里的目的是根据您的用例进行建模,而不是根据您的真实世界模型!

您需要想知道的是“我的收藏支持的实际用例是什么?”。如果您支持很多,只需将它们分开即可。

另一方面,即使您查询不同的字段但您总是想检索整个文档,那么您的集合可能会很好地支持您的查询。产生更好性能的一种方法是在您经常使用的字段上添加索引(官方文档:https://docs.mongodb.org/manual/core/indexes/)。归根结底,分片可能是您要寻找的东西,因为集合非常庞大,并且可能与基于任意属性拆分记录并将您的数据库分布在多台机器上相关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2021-06-22
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多