在N postgresql分片上使用WHERE和ORDER BY的应用程序级JOIN

时间:2011-07-16 08:48:34

标签: postgresql cluster-computing sharding

我有一个postgresql集群,其中不同的表位于不同的分片(不同的物理postgresql服务器)中。 EG:

碎片A. + user_group(user_group_id,user_group_name)

碎片B + user(user_id,user_group_id(NULL),user_name)

碎片C. +评论(comment_id,user_id,comment_content)

我需要运行查询,如果所有3个表在同一个分片上,它看起来像:

SELECT comment_id,comment_content FROM comment INNER JOIN user ON comment.user_id = user.user_id LEFT JOIN user_group ON user.user_group_id = user_group.user_group_id WHERE user_group_id> 10 AND user_name LIKE'foo%'ORDER BY user_group_name ASC,user_name ASC,comment_id ASC

如果3个表位于3个不同的物理postgresql分片中,那么如何实现这样的查询?

我已经读过有关人们必须“在应用程序层中进行连接”的引用,但我不知道如何解决这个问题。一些复杂性包括: 1.不同表的基数是未知的(或者可以随时间变化),所以从应用层(EG:php,python等等),我们不知道是否应该首先去查询user_group,得到所有用户组,然后查询用户,获取所有用户等...,或首先查询评论,获取所有评论,然后过滤用户检索到的评论,然后按用户组过滤等...

我正在寻找将sql转换为应用程序级联接的通用方法,而上述架构只是一个假设的例子。

2 个答案:

答案 0 :(得分:1)

您需要查看db_link contrib。

答案 1 :(得分:1)

通常,数据在分片中以一种允许完全避免跨服务器JOINS的方式进行分割。因为这种操作既困难又昂贵。如果您的示例是假设的,我建议您按user_id字段或user_group_id划分所有数据。

例如,分片A将包含来自用户的所有表,其中user_id%3 = 0,分片B - 哪个user_id%3 = 1,分片C-哪个user_id%3 = 2.因此大多数需要的JOINS将在里面一个碎片。对于某些复杂的跨服务器查询,您可能拥有常见的NO-SQL存储,如memcached或Redis,它们将包含来自所有分片的所需数据的副本(当然,它不是所有表的完整副本)。这些存储可以根据需要轻松复制到尽可能多的服务器上。这就是高负载项目的工作原理。