有效的方法来组合两个数据库查询的结果

时间:2010-05-11 04:46:50

标签: python mysql database pylons sharding

我在不同的服务器上有两个表,我希望找到一种有效的方法来组合和匹配数据集。这是一个例子:

从包含我们故事的服务器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获取有关每个author_id的一些信息:

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

现在我需要一些方法来组合这两个查询,所以我有一个dict,它有故事以及avatar_url和member_id。

如果这些数据在一台服务器上,那么它将是一个简单的连接,如下所示:

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

但是,由于我们将数据存储在多个服务器上,因此无法实现。

最有效的方法是什么?我理解合并可能必须在我的应用程序代码中发生...任何有效的示例代码,最小化dict循环的数量将非常感激!

感谢。

4 个答案:

答案 0 :(得分: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

这不是特别有效(n 2 ),但它相对简单,你可以调整它来做你所需要的。

答案 1 :(得分:0)

您必须以某种方式将数据汇集在一起​​。

  • 有些服务器链接(尽管可能不是mysql上下文中的正确术语)可能允许查询不同的数据库。这打开了另一组问题(安全性!)

  • 更简单的解决方案是将数据放在一个数据库中。

  • 最后一个(最不理想的)解决方案是像Padmarag建议的那样加入代码。

答案 2 :(得分:0)

唯一的选择看起来是数据库链接,但遗憾的是在MySQL中不可用 您必须在应用程序代码中进行合并。最好将数据保存在同一个数据库中。

答案 3 :(得分:0)

是否可以设置从一台服务器到另一台服务器的所需表的复制? 这样你就可以在一台服务器上拥有所有数据。

此外,请参阅FEDERATED存储引擎,自mysql 5.0.3以来可用。