Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 跨数十个数据库合并数据';在非昂贵的查询中是什么?_Mysql_Performance_Multiple Databases - Fatal编程技术网

Mysql 跨数十个数据库合并数据';在非昂贵的查询中是什么?

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)的进度结合起来,那就太好了。例如

我经营一个网站,公司在那里创建帐户,并让他们的用户注册他们的帐户。我工作过的几家公司都有敏感数据,出于这个原因,不久前我们就做出了决定,我们将为在我们网站注册的每家公司维护单独的数据库

要明确的是,对于A、B和C公司,DB的外观类似于下图

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)
在初始运行时,需要运行某种“重建”过程,该过程逐步遍历每个公司表并填充全局表。这在以后的“重新计票”过程中也很有用(比如,你放弃了dbA,不想让这些分数再计算)
如果每个用户在全局点数据库中没有记录,您也可以将其设置为一个子程序,每个用户只需在后台触发一次。

这是一个关于您应该做什么的非常可靠的解释。还有一件事需要补充:不要在每次加载页面时重新计算。登录时将积分保存在会话中,并仅在获得积分的页面上更新会话。正如他在更新
dbGlobalPoints
更新会话时所建议的那样,我最终修改了多租户设计,其中每个租户都有自己的数据库。花了很长时间,但很值得。谢谢你的回答。