gpt4 book ai didi

join - 分片如何处理关联表的连接?

转载 作者:行者123 更新时间:2023-12-03 16:18:53 25 4
gpt4 key购买 nike

当我阅读有关分片的内容时,看起来作者没有考虑到分片表必须连接到的其他表(即使他们将分片描述为“原始数据库的子集”)。但是,这是一种非常常见的情况,我仍然不知道如何处理。一些作者提到了由分片表引用的“静态”表,可以复制到每个分片(例如, Country )。但是,他们没有提及引用分片表的表。

想象一下,我们运行一个社交网络并意识到我们的 用户 由于大量写入或大小(或两者),表(id,名称)不再适合单个服务器。所以我们决定将它水平分割成多个分片(比如 4 个,所以 id 1-1000 的用户转到一个分片,1001-2000 转到另一个分片等)并选择一个 用户 ID 作为分片键。自 用户 表通常连接到其他表,我们将记录从引用给定用户或由它引用的表移动到相应的分片(这是一个很大的挑战,因为关系通常是可传递的,例如,表 A 可能引用 B 引用分片表C)。为了简化事情,我们可以决定将除 User 表之外的所有表完整复制到所有分片。到现在为止还挺好。

然后,想象一下 好友 表 (id, user_id,friend_id) 包含有关谁是谁的 friend 的信息并引用了 用户 table 。用户 1001 有 2 个 friend ,2002 和 3003,他们位于不同的分片上。所以如果我们需要获取用户 1001 个 friend 的信息,我们将不得不执行 2 次跨分片连接。即使我们最初设法将所有相关用户放在同一个分片上,用户也可以从不同的分片添加新 friend 。我们不能将这个 friend 4004 移动到用户 1001,因为来自同一分片 #5 的其他用户也可以将他作为 friend 。

老实说,我无法弄清楚在执行分片时如何处理这种情况,而且我还没有看到任何资源对此进行解释。

最佳答案

在跨分片表进行连接时,您通常希望优化的是跨分片传输的数据量。

正如 here 所解释的,有 5 种类型的分布式连接。 ,从最喜欢到最不喜欢:

  • 本地/并置引用表加入

  • 这是您在 Countries 中提到的示例 table 。每个节点都在本地保留此表的副本,因为它很少更新。利弊显而易见:并非所有内容都可以标记为引用表,但不涉及数据移动。
  • 本地/并置分布式表连接

  • 这意味着向连接所需数据所在的所有节点发送查询。然后,汇总整体执行结果。缺点是需要在连接条件中涉及的列上对表进行分片。这是最具可扩展性的算法,因为它在执行联接之前不涉及数据移动。

    这将适用于您的 Friends表示例。想必,您的 Users table 将由 User id 键控,它也是分片键,所以会有一个索引,所以查询应该很快。
  • 远程分布式表加入

  • 集群中的所有节点将它们在连接两侧的数据发送到单个节点,以便它可以运行连接。这种类型的连接仅在连接中涉及的行数很少时表现良好。
  • 广播加入

  • 如果您正在执行连接,其中一侧具有大数据集而另一侧具有小数据集,则此类型将小数据集发送到较大数据集,并且具有大数据集的节点在本地进行连接。
  • 随机加入

  • 这是运行分布式连接的最昂贵但最灵活的方式。由于联接中涉及的许多行被复制到其他节点以执行联接,因此需要大量数据移动。

    关于join - 分片如何处理关联表的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47472209/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com