高效合并两个数据库查询结果的方法
我有两个在不同服务器上的表格,我想找个高效的方法来合并和匹配这些数据。举个例子:
在服务器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),但相对简单,而且你可以根据自己的需要进行调整。