高效合并两个数据库查询结果的方法

1 投票
4 回答
2587 浏览
提问于 2025-04-15 22:34

我有两个在不同服务器上的表格,我想找个高效的方法来合并和匹配这些数据。举个例子:

在服务器1上,这里存放着我们的故事,我执行了一个查询,像这样:

query = """SELECT author_id, title, text
           FROM stories
           ORDER BY timestamp_created DESC
           LIMIT 10
           """
results = DB.getAll(query)

for i in range(len(results)):
    #Build a string of author_ids, e.g. '1314,4134,2624,2342'

但是,我还想从服务器2获取每个作者的相关信息:

query = """SELECT id, avatar_url
           FROM members
           WHERE id IN (%s)
           """
values = (uid_list)
results = DB.getAll(query, values)

现在我需要一种方法来把这两个查询结合起来,这样我就能得到一个字典,里面有故事、头像链接和会员ID。

如果这些数据在同一个服务器上,合并会很简单,像这样:

SELECT *
FROM members, stories
WHERE members.id = stories.author_id

但因为我们的数据分散在多个服务器上,所以这样做是不可能的。

那么,有什么高效的方法可以做到这一点呢?我知道合并可能得在我的应用代码中进行……如果能提供一些减少字典循环次数的高效示例代码,那就太好了!

谢谢。

4 个回答

0

看起来唯一的选择是数据库链接,但很遗憾在MySQL中没有这个功能。
你需要在你的应用程序代码中进行数据合并。最好把数据放在同一个数据库里。

0

你需要想办法把数据整合在一起。

  • 有一些东西,比如服务器链接(虽然在mysql的上下文中,这可能不是正确的说法),可以让你在不同的数据库之间查询。这会带来另一系列的问题(比如安全性!)

  • 更简单的解决办法是把数据放在一个数据库里。

  • 最后一种(最不推荐的)解决方案是像Padmarag建议的那样在代码中进行合并。

2

如果内存不是问题的话,你可以使用字典。

results1_dict = dict((row[0], list(row[1:])) for row in results1)
results2_dict = dict((row[0], list(row[1:])) for row in results2)

for key, value in results2_dict:
    if key in results1_dict:
        results1_dict[key].extend(value)
    else:
        results1_dict[key] = value

这样做效率不是特别高(是n2),但相对简单,而且你可以根据自己的需要进行调整。

撰写回答