【问题标题】:can MongoDB use a shard key's prefix for routing or does it need the entire shard key to route?MongoDB 可以使用分片键的前缀进行路由还是需要整个分片键来路由?
【发布时间】:2020-07-16 20:20:07
【问题描述】:

背景:

环境:

  • MongoBD 4.2
  • 碎片:10
  • Shard Key:{domain: 1, email: 1, objecttype: 1}

数据说明:

  • 基数约为 300
  • email 基数约为 100k(不均匀分布在域中。一个域可能有 30k 电子邮件)
  • objecttype 基数:10 种类型(例如,“文件”、“消息”、“通知”等)

问题:

  1. 如果我的查询只包含 {domain: 'foo.com', email: 'user@foo.com'},mongos 是否能够确定要查询的分片子集?还是会查询所有分片?

  2. 如果它可以智能地路由#1 的请求,它是否也适用于像 {domain: 'foo.com', objecttype: 'file'} 之类的查询(它会跳过电子邮件字段)

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    Q1:也许吧。这取决于块边界的位置。 mongos 可以确定域-电子邮件对“foo.com-user@foo.com”仅存在于 1 个分片上,然后它可以仅针对该分片,但如果该用户特别多产并且有足够的对象存在具有该域-电子邮件组合的每个分片上的一个块,每个分片都需要参与。

    Q2:不可以。由于 mongos 无法提前确定哪些电子邮件将与每个对象类型相关联,因此它必须将电子邮件视为通配符并将查询提交给所有分片。

    编辑
    正如 cmets 中所指出的,如果包含域的块仅存在于分片的子集上,则方案 2 可以将其限制为域搜索,就像查询是 {domain: 'foo.com'}

    【讨论】:

    • 对于第二季度,我一直在做一些非常基本的测试,它似乎确实将查询定向到单个分片而不是所有分片。我正在尝试找到一个示例块,它的域+电子邮件组合跨越 2 个分片,但看起来我的示例数据集中没有任何内容。但如果 mongos 足够聪明,可以回答第一季度的查询,我想它可以限制仅基于域的分片。
    • 我能够使数据集足够大以创建跨越两个分片的块。对于在这些块中有结果的查询,explain() 结果显示一个 SHARDING_MERGE 阶段。如果查询在跨分片的块中没有结果,那么它会执行 SINGLE_SHARD 请求。所以基本上,看起来 mongos 做事很聪明。
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2020-10-28
    • 1970-01-01
    • 2017-12-28
    • 2018-09-15
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多