Mysql 跨数十个数据库合并数据';在非昂贵的查询中是什么?
我经营一个网站,公司在那里创建帐户,并让他们的用户注册他们的帐户。我工作过的几家公司都有敏感数据,出于这个原因,不久前我们就做出了决定,我们将为在我们网站注册的每家公司维护单独的数据库 要明确的是,对于A、B和C公司,DB的外观类似于下图Mysql 跨数十个数据库合并数据';在非昂贵的查询中是什么?,mysql,performance,multiple-databases,Mysql,Performance,Multiple Databases,我经营一个网站,公司在那里创建帐户,并让他们的用户注册他们的帐户。我工作过的几家公司都有敏感数据,出于这个原因,不久前我们就做出了决定,我们将为在我们网站注册的每家公司维护单独的数据库 要明确的是,对于A、B和C公司,DB的外观类似于下图 db_main /* Stores site info for each company */ db_a db_b db_c 现在,我发现有时候一个用户在a公司和B公司都创建了一个帐户,所以如果我能将他们在两个站点(a和B)的进度结合起来,那就太好了。例如
db_main /* Stores site info for each company */
db_a
db_b
db_c
现在,我发现有时候一个用户在a公司和B公司都创建了一个帐户,所以如果我能将他们在两个站点(a和B)的进度结合起来,那就太好了。例如,如果用户在站点A上获得5分,在站点B上获得5分,我希望他们的站点总积分为“10”(他们的总积分为5+5)
然而,有数百个这样的数据库,我担心在服务器上不停地在所有数据库上运行查询会很困难。例如,用户的分数是在每次页面加载时计算的
有没有一种有效的方法可以以这种方式运行查询?加入到100 DB永远都不应该是一种选择,而且对于您的问题来说,这是没有效率的 我的建议是创建一个全局表,它存储全局跟踪的点的缓存。点不应该以任何方式从它的声音“敏感”。我假设用户ID也不是。考虑到客户永远不应该拥有对此表的直接查询访问权,这应该不是问题 场景:
- 用户加入siteA
- 赚5分
- dbA得到更新
- dbGlobalPoints被上传(如果存在(不会),更新points+5,否则插入userID,5)
- 然后,用户使用相同的用户名加入siteB(如果您没有跨系统的唯一id,这可能是您最大的问题)
- 配置文件查询拉入/连接dbGlobalPoints以显示
- 赚10分
- dbB得到更新
- dbGlobalPoints得到upsert'ed(如果存在(它将),更新points+10,否则插入userID,10)
如果每个用户在全局点数据库中没有记录,您也可以将其设置为一个子程序,每个用户只需在后台触发一次。这是一个关于您应该做什么的非常可靠的解释。还有一件事需要补充:不要在每次加载页面时重新计算。登录时将积分保存在会话中,并仅在获得积分的页面上更新会话。正如他在更新
dbGlobalPoints
更新会话时所建议的那样,我最终修改了多租户设计,其中每个租户都有自己的数据库。花了很长时间,但很值得。谢谢你的回答。