gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:14:37 25 4
gpt4 key购买 nike

我有一个 postgresql 集群,其中不同的表驻留在不同的分片(不同的物理 postgresql 服务器)中。例如:

分片A+ user_group (user_group_id, user_group_name)

碎片B+ 用户 (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 升序

如果 3 个表驻留在 3 个不同的物理 postgresql 分片中,将如何实现这样的查询?

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

我正在寻找一种将 sql 转换为应用程序级连接的通用方法,上面的模式只是一个假设的例子。

最佳答案

通常,数据在分片处的划分方式可以完全避免跨服务器 JOINS。因为这个手术难度大,费用高。如果您的示例是假设性的,我建议将所有数据除以 user_id 字段或 user_group_id。

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

关于postgresql - 在 N 个 postgresql 分片上使用 WHERE 和 ORDER BY 的应用程序级 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6716351/

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