【问题标题】:indexing large array in mongoDB在 mongoDB 中索引大数组
【发布时间】:2018-03-17 23:26:36
【问题描述】:

根据 mongoDB 文档,不建议为大型数组创建多键索引,那么替代方案是什么?

我想在我的应用用户的一个联系人也开始使用该应用时通知他们,因此我必须上传和管理每个用户的联系人列表。 我们正在使用带有副本集的 mongoDB 和两台辅助机器。 mongo 可以处理具有数百个值的数组的多键索引吗? 管理数十万用户的数百个联系人可能非常困难。

多键解决方案如下所示:

{
  customerId: "id1",
  contacts: ["aaa", "aab", "aac", .... "zzz"]
}

索引:createIndex({ contacts: 1 })

另一种解决方案是将每个联系人保存在自己的文档中,并保存与他相关的所有应用用户:

{
  phone: "aaa",
  contacts: ["id1", "id2", "id3"]
},
{
  phone: "aab",
  contacts: ["id1"]
},
{
  phone: "aac",
  contacts: ["id1"]
},
......
{
  phone: "zzz",
  contacts: ["id1"]
}
index: createIndex( { phone: 1 } )

在上传联系人列表时,两者的写作表现都很差:
第一个用于计算巨大的索引,第二个用于同时更新大量文档。
有没有更好的方法?
我正在使用带有两台辅助机器的副本集,分片键有帮助吗?

谢谢

【问题讨论】:

    标签: arrays mongodb performance indexing multikey


    【解决方案1】:

    为了索引包含数组值的字段,MongoDB 为数组中的每个元素创建一个索引键。 These multikey indexes support efficient queries 针对数组字段。 所以如果我是你,我的数据模型会是这样的:

    {
        customerId: "id1",
        contacts: ["_idx", "_idy", "_idw", .... "_idz"]
    }
    

    然后在联系人上创建索引。 MongoDB 默认在 id 上创建索引。因此,您必须为非应用用户创建新文档,只需尝试添加一个字段,例如“app_user”:true/false。

    对于索引性能,您可以使用build in the background 没有任何问题,对于副本集,this is how it's done.

    对于sharding,它对您没有帮助,因为您甚至无法对任何东西进行分片,因为您的集群中有一个主节点。分片至少需要 2 组主要的 Mongo 实例,因此在您的情况下,您可以添加第四台服务器,然后有两个副本集,一个主副本集和一个辅助副本集,然后对它们进行分片,并将您的系统转换为 2 个复制分片。

    一旦实现这一点,它显然会平衡 2 个分片之间的负载,尽管 MongoDB 处理一百个文档并不算多。

    另一方面,如果您要进行分片,则需要更多设置,如果您使用的是 Mongodb 3.4 或更高版本,则需要配置服务器。

    【讨论】:

    • 感谢您的回复。很可能每个用户上传的大多数联系人都不是应用程序用户,因此他们没有_id。如果我将每个联系人保存为文档,就像我写的第二个选项一样,他们将拥有。我只是想再次澄清一下,现在我有超过 300k 的用户,如果他们都上传了 ~800 个联系人,那么将它们全部索引或为每次上传编写 ~800 个新文档会降低性能。
    • 800 个文档,对于 MongoDB 来说几乎为零,因此它不会在写入方面产生任何性能问题。另一方面,如果所有用户同时上传,那会造成一些问题,如果您启用分片可以解决。很有可能,这 30 万用户之间会有共同的联系人,因此请尽量依靠电话号码,因为它们是独一无二的,以避免重复。
    • @zigy,如果它确实回答了您的问题,您能否将其标记为答案?
    • 副本集的后台构建用于为填充的集合创建索引。我的问题是为每个新上传建立索引。每次新上传的约 1000 个电话号码的索引数组仍然会损害性能,并且 CPU 使用率会达到最大值,即使使用 {background: true}。下周我将测量另一个解决方案,为每个新联系人创建文档,以管理与他相关的所有客户。我会不断更新。谢谢!
    猜你喜欢
    • 2021-06-02
    • 2015-03-04
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多