mysql - 在一个不昂贵的查询中合并数十个数据库的数据?

标签 mysql performance multiple-databases

我经营一个网站,公司在其中创建帐户并让其用户注册他们的帐户。与我合作的几家公司拥有敏感数据,因此不久前我们就决定为在我们网站上注册的每家公司维护单独的数据库。

需要明确的是,公司 A、B 和 C 的数据库与下面的类似。

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 永远不应该是一种选择,对于你的问题,它不会有效。

我建议创建一个全局表来存储您在全局范围内查找的点的缓存。从声音来看,点不应该以任何方式“敏感”。我认为 userID 也不是。鉴于客户永远不应该直接查询访问此表,这应该不是问题。

场景:

  • 用户加入站点A
  • 获得 5 分
  • dbA 已更新
  • dbGlobalPoints 被更新(如果存在(不会),更新点+5,否则插入 userID,5)

  • 用户然后使用相同的用户名加入 siteB(如果您没有跨系统的唯一 ID,这可能是您最大的问题)

  • 配置文件查询拉取/连接 dbGlobalPoints 进行显示
  • 获得 10 分。
  • dbB 已更新
  • dbGlobalPoints 被更新(如果存在(它会),更新点+10,否则插入 userID,10)

在初始运行时,需要运行某种“重建”过程,该过程将遍历每个公司表并填充全局表。这对于稍后的“重新计数”过程也很有用(例如,您删除 dbA 并且不想再计算这些点) 如果用户在全局点数据库中没有记录,您还可以将此子例程设置为每个用户仅触发一次(在后台)。

关于mysql - 在一个不昂贵的查询中合并数十个数据库的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746162/

相关文章:

php - 表单数据未发送到 MySql 数据库

javascript - 离线优先的 webapp 本地存储同步到 MySQL

php - 如何在 codeigniter 中为联合表添加分页

.net - 如何加快我的 .NET 应用程序第一次执行的性能?

php - Magento::类别和子类别

java - 使用 jpa(MYSQL) 创建一对多关系

java - 对 double 使用模时性能会下降

java - 什么工作更快 : two dimensional arrays or list of lists

php - 如何在 CodeIgniter 中执行 SQL 查询

wcf - 如何为多个数据库实现存储库模式