【问题标题】:How do database joins work in a distributed relational database?数据库连接如何在分布式关系数据库中工作?
【发布时间】:2020-05-05 17:54:33
【问题描述】:

根据我自己的研究,我了解单个数据库(非分布式)上的 SQL 连接算法背后的基本思想 - 例如。哈希连接、合并连接、循环连接。分布式连接算法是否类似于非分布式数据库上的连接算法?

例如,如果我有一个带有属性的用户表: - 用户身份 - 年龄

我有一个带有属性的评论表: - 用户身份 - Comment_id - 评论

假设分布式数据库使用 User_id 对 Users 表进行分片,并使用 Comment_id 对 Comments 表进行分片。

那么当您调用 SQL 查询时实际发生了什么:

SELECT * FROM Users INNER JOIN Comments ON Users.User_id = Comments.User_id

? User表和Comment表是否整理到一台机器上,然后执行JOIN?或者是否有某种方式可以让您进行 JOIN,即使它是分布式的?

【问题讨论】:

  • 请记住,分片只是众多其他分区策略中的一种。您是专门询问分片还是一般分区?
  • 我想一般是分区,但我对分片很熟悉,所以一个基于分片的例子会很棒!
  • 这篇文章可能会有所帮助,因为它解释了多种方法及其优缺点:singlestore.com/blog/scaling-distributed-joins

标签: sql database distributed


【解决方案1】:

这是一个高级别的答案。

在分布式环境中,JOINs 有几种方法。

  1. 广播连接。一个表被复制并发送到所有处理节点,每个处理节点都有一个更大的表的一部分。规范用例是一个大表和一个小参考表。

  2. 两个表具有相同分区键的哈希连接。在这种情况下,可以在本地完成连接,因为所有相关数据都已位于同一位置。

  3. 哈希连接基于一张表的分区键。第二个表被散列并且数据被发送到适当的节点。然后返回到 (2)。

  4. 一个完整的散列连接,其中两个表的数据被散列并发送到并置的节点。

请注意,此处的“哈希”一词是通用的。如果分区是基于数据范围的,那么这就是哈希函数的一个例子。

一旦将数据发送到特定节点,就会使用其他一些JOIN 算法——它可以是基于散列的、基于排序的或基于索引的(如果分布式数据也支持索引;很多都支持)不是)。

此外,可能会对算法进行调整以处理“大于内存”的结果和JOIN 键中的数据倾斜。

更详细的答案可能会写满一本书的多个章节。

【讨论】:

  • 您好,感谢您的回答!我对您提到的 JOIN 仍然有些困惑。在广播连接中,“一个表被复制并发送到所有处理节点”是什么意思?以我的问题中的用户和评论示例为例,假设表被分成多台机器——机器 1 有用户表的第 1 部分,机器 2 有用户表的第 2 部分,机器 3 有评论表的第 1 部分,机器 4 有评论表的第 2 部分。您是说用户表在其中一台机器(1 或 2)中重建,然后发送到机器 3 和 4?
  • 一旦它被发送到机器 3 和 4,就会执行本地 JOIN。然后,在单机上整理结果,然后返回结果?
  • @Ryn 。 . .这确实是一个相当广泛的主题,在问答论坛或 cmets 中不容易解释。
  • @GordonLinoff Cmon,您至少应该尝试一下。这是一个非常有趣的问题,但到目前为止我看到的大多数答案都很模糊。向任何有分片数据库的跨主机连接实践经验并且可以解释事情的人表示敬意。如果一个人不能解释一个主题,那就意味着他不理解它......
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2020-02-26
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多