使用单个和多个数据库时,性能有何提高?

时间:2011-10-27 06:51:36

标签: database performance optimization architecture

我们正在构建一个软件,它接收每个系统大约100个数据项的预先计算的小时平均值,每天大约发送一次。可能有大约20个客户拥有5-50个系统。因此理论最大值将大约每天插入100 * 24 * 20 * 50 = 2400000行。

每天不太可能有那么多插页,但这是我们需要牢记的。

如果我们拆分数据库结构以便每个客户都拥有自己的数据库(如上一张图片中),是否有性能提升?在共享数据库中,将存在用户及其与数据库的关联。

enter image description here

multiple databases

更新

数据将保留约2 - 3年,然后系统将自动删除旧数据。用户不会删除“任何东西”,在这种情况下,任何东西都意味着从客户系统发送的数据。

更新2

在图像中,服务器和数据库周围有一个云。更具体地说:云是Microsoft Azure实施的云计算。

4 个答案:

答案 0 :(得分:1)

如果每个客户仅使用自己的数据工作,并且不需要访问其他客户数据,我认为由于表锁只会影响一个客户的数据,因此可以获得一些性能,例如当客户A在表上运行级联删除时,其他客户仍然可以从各自数据库中的同一表中读取和修改数据。如果没有这样的拆分,表锁会影响所有。

话虽这么说,拆分数据库会使管理(进行备份,修改数据库结构,更新数据库地址等)更加麻烦和容易出错。

您可以从一个数据库开始,保存所有数据。然后,如果您发现客户经常等到其他客户操作完成,您可以拆分数据库;如果您正确地抽象数据库访问,则不需要对代码进行大的更改。

请记住,过早优化是万恶之源!

答案 1 :(得分:0)

如果数据库位于不同的物理磁盘上,则读取和写入数据都会有性能提升。如果它们位于同一磁盘/服务器上,则性能增益太小而无法打扰。另一方面,如果您使用多个服务器,重要的问题是您可以并行查询它们吗?如果你做不到,很可能你不会尽可能多地从性能上获益。

拥有多个插入是一个I / O绑定操作,因此您必须优化磁盘访问。在不同磁盘上拆分负载是您可以做到的最佳方式,但如果不能,您仍然可以提高性能:

  • 确保写入仅附加。在MySQL / InnoDB中,数据按主键的顺序存储,因此使用自动增量来避免随机写入。在其他RDBM中,您可以选择群集密钥,因此请明智地选择
  • 如果可以,将数据保存在另一个磁盘上的一个dist和bin日志中 - 您将有效地将负载拆分为2个磁盘
  • 如果你可以拆分读写(主/从复制),那么主人只会忙于写作

答案 2 :(得分:0)

更好,更通用的解决方案是运行主数据库和几个从机(只读,自动与主机同步)dbs。更新将发送到主服务器,但选择将沿所有dbs分发(因为无论运行何种查询,选择都将获得相同的结果)。

有许多产品“开箱即用”,包括开源和商业。

答案 3 :(得分:0)

我认为您的问题主要与“多租户”设计有关 - 您如何设计单个系统供多个用户使用?它在Basecamp等“软件即服务”产品中很常见。

我不知道任何确定的答案,但我通常的建议类似于socha23:设计您的解决方案,以便它可以支持多个数据库,但只有在您需要时才这样做。

通常,为每个用户提供单一解决方案更容易管理。您只需要备份一个数据库。您只需部署一个代码库。您的配置文件很容易保持同步。

为个人客户提供单独的基础设施(硬件或软件)会使一切变得更加复杂 - 您应该投入大量的自动化来管理这种复杂性(我建议采用“持续交付”方法 - http://continuousdelivery.com/)。成本远远超出了硬件或软件许可证 - 所以如果有充分的理由,你应该只承担这笔费用。

这可能是大多数SaaS提供商拥有分层服务的原因。在您的情况下,如果他们准备支付额外的性能,您可以为“黄金”客户提供他们自己的数据库。

相关问题