将MySQL数据库拆分为单独的数据库

时间:2014-03-10 12:08:49

标签: java mysql database spring hibernate

我要求在我的应用程序中使用的MySQL数据库非常积极地进行扩展。我目前没有状态迁移到NoSQL数据库。

我已经找到了以下哪些方面可以尝试将当前数据库拆分为多个数据库:

  1. 有些桌子有静态内容,即几乎没有变化。
  2. 有用户表在交互时存储用户数据,这些用户数据发生了巨大变化。
  3. 现在,如果我将数据库拆分为两个不同的数据库,我将如何处理该事务?如何编写数据访问层,我是否可以连接两个数据库?该应用程序目前使用Spring& Hibernate for Back End。有些调用会连接用户表和当前架构中的内容表。

    架构遵循当前结构: 控制器 - >服务 - > DAO层。

    所以,如果我愿意重构与数据库通信的DAO层,我应该采用什么方法?我只知道Hibernate ORM,但如果有比Hibernate更好的东西,我愿意放手。

2 个答案:

答案 0 :(得分:0)

听起来你没想过数据库的分区。 您应首先阅读有关数据库规范化的内容:database normalization

要分割数据库,我将从数据库中导出sql代码,然后我会创建2个新文件,我复制我想要在特定数据库中的表。之后我会导入特定数据库中的2个文件。

我认为这可能有助于我帮助我:假设我想为用户打印报告。用户持久存储在“用户”表中,并且有一个分数表,其中包含每个user_id的用户分数。现在,我的计划是将用户表放在一个数据库中,并将得分表放在另一个数据库中,使它们成为两个数据源。我该如何处理这种情况?

首先将表放在不同的数据库中对我来说没有任何意义,我不知道是否有能力对不同的数据库进行混合查询。

示例:SELECT分数,名称FROM用户,得分WHERE得分> 100 AND(score.user_id = user.user_id);

如果我认为不适合两个数据库,我不会。

答案 1 :(得分:0)

同一台服务器上的多个数据库?这种方法可能无法单独提高性能。 RAM,快速磁盘,优化,分区和正确的索引将获得更大的回报。

如果一台服务器上有多个数据库,则可以通过单个连接连接到它们,只需将数据库名称与SQL中的表名一起使用即可。事务在单个连接中正常工作。

跨多个连接和多个服务器的事务更难。 MySQL中有一个名为XA事务的功能可以帮助解决这个问题。但它有很多开销,因此对银行业中的高价值交易最有用。

在行业术语中,添加服务器称为“横向扩展”。另一种选择是“向上扩展”,您可以在其中向单个服务器添加更多RAM,更快的直接访问存储,优化和其他内容,以使其能够执行更多操作。

您可以采用多种方法来解决横向扩展问题。经典之一是使用MySQL来执行单主机多负载平衡从属复制。这可能是最经常采用的路径,所以你可以在不重新制造大量车轮的情况下完成。在此解决方案中,您可以将所有内容写入单个实例。查询数据的查询可以使用多个只读负载平衡实例。

http://dev.mysql.com/doc/refman/5.5/en/replication-solutions-scaleout.html

这是一种非常流行的方法,您可以混合使用长时间运行的报告查询和短时间运行的交互式查询。报告可以在专用从属服务器上运行。

另一种方法是使用MySQL Cluster进行多主复制。 https://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-replication-multi-master.html

另一种方法,如果你有钱可花,就是使用支持的MySQL Cluster。 Oracle,MariaDB和Percona都提供此类产品。

无论您如何处理,横向扩展都是一项重要工作。其他人已经完成了一些记录的经验。例如,https://www.facebook.com/note.php?note_id=23844338919