49

我们有一个大约 70 GB 的 InnoDB 数据库,我们预计它会在未来 2 到 3 年内增长到数百 GB。大约 60% 的数据属于单个表。目前数据库运行良好,因为我们有一个 64 GB RAM 的服务器,所以几乎整个数据库都可以放入内存,但我们担心未来数据量会变得相当大。现在我们正在考虑某种拆分表格的方法(尤其是占数据最大部分的表格),我现在想知道,最好的方法是什么。

我目前知道的选项是

  • 使用 5.1 版附带的 MySQL 分区
  • 使用某种封装数据分区的第三方库(如休眠分片)
  • 在我们的应用程序中自己实现它

我们的应用程序建立在 J2EE 和 EJB 2.1 之上(希望有一天我们会切换到 EJB 3)。

你有什么建议?

编辑(2011-02-11):
只是一个更新:目前数据库的大小是 380 GB,我们的“大”表的数据大小是 220 GB,它的索引大小是 36 GB。因此,虽然整个表不再适合内存,但索引却可以。
系统仍然运行良好(仍然在相同的硬件上),我们仍在考虑对数据进行分区。

编辑(2014-06-04):另一个更新:整个数据库的大小是 1.5 TB,我们的“大”表的大小是 1.1 TB。我们将服务器升级到具有 128 GB RAM 的 4 处理器机器(Intel Xeon E7450)。该系统仍然运行良好。我们接下来计划做的是将我们的大表放在单独的数据库服务器上(我们已经在软件中进行了必要的更改),同时升级到具有 256 GB RAM 的新硬件。

这种设置应该持续两年。然后我们要么必须最终开始实施分片解决方案,要么只购买具有 1 TB RAM 的服务器,这应该会让我们持续一段时间。

编辑(2016-01-18):

从那以后,我们将我们的大表放在单独服务器上的它自己的数据库中。目前,这个数据库的大小约为 1.9 TB,另一个数据库(除了“大”表之外的所有表)的大小为 1.1 TB。

当前硬件设置:

  • HP ProLiant DL 580
  • 4 x Intel(R) Xeon(R) CPU E7-4830
  • 256 GB 内存

此设置的性能很好。

4

8 回答 8

25

一旦它不再适合内存,您肯定会开始在该 42 GB 表上遇到问题。事实上,一旦它不再适合内存,性能就会迅速下降。一种测试方法是将该表放在另一台 RAM 较少的机器上,看看它的性能有多差。

首先,除非您还将一些表移动到单独的物理卷,否则拆分表并不重要。

这是不正确的。分区(通过 MySQL 5.1 中的功能,或者使用 MERGE 表的相同功能)可以提供显着的性能优势,即使这些表位于同一驱动器上。

例如,假设您正在使用日期范围在大表上运行 SELECT 查询。如果表是整个表,查询将被迫扫描整个表(在那个大小下,即使使用索引也会很慢)。分区的优点是您的查询只会在绝对必要的分区上运行。如果每个分区大小为 1 GB,而您的查询只需要访问 5 个分区即可完成自身,那么对于 MySQL 来说,组合的 5 GB 表比 42 GB 的怪物版本更容易处理。

您需要问自己的一件事是如何查询数据。如果您的查询有可能只需要访问某些数据块(即日期范围或 ID 范围),那么某种分区将证明是有益的。

我听说 MySQL 5.1 分区仍然存在一些错误,特别是与 MySQL 选择正确的键有关。MERGE 表可以提供相同的功能,尽管它们需要稍微多一点的开销。

希望对您有所帮助...祝您好运!

于 2008-09-25T13:58:57.003 回答
9

如果您认为您将受到 IO/内存限制,我认为分区不会有帮助。像往常一样,首先进行基准测试将帮助您找出最佳方向。如果您没有 64GB 内存的备用服务器,您可以随时向供应商索要“演示单元”。

如果您不期望 1 个查询聚合报告,我会倾向于分片。我假设你会分片整个数据库,而不仅仅是你的大表:最好将整个实体放在一起。好吧,无论如何,如果您的模型拆分得很好。

于 2008-09-05T15:00:05.877 回答
6

这是一个很好的例子,说明 MySql 分区在一个真实的大数据流示例中可以做什么:

http://web.archive.org/web/20101125025320/http://www.tritux.com/blog/2010/11/19/partitioning-mysql-database-with-high-load-solutions/11/1

希望对您的案例有所帮助。

于 2010-11-21T21:51:54.767 回答
1

不久前,在 Microsoft ArcReady 活动中,我看到了一个关于缩放模式的演示文稿,可能对您有用。您可以在线查看它的幻灯片

于 2008-09-05T14:33:17.423 回答
1

我会选择 MariaDB InnoDB + Partitions(根据您的查询,按键或按日期)。

我这样做了,现在我没有任何数据库问题了。

MySQL 可以在几秒钟内被 MariaDB 替换……所有数据库文件保持不变。

于 2011-10-11T10:30:05.327 回答
0

首先,除非您还将一些表移动到单独的物理卷,否则拆分表并不重要。

其次,它不一定是您要移动的物理尺寸最大的桌子。您可能有一个小得多的表来获得更多活动,而您的大表保持相当稳定或仅附加数据。

无论您做什么,都不要自己实施。让数据库系统处理它。

于 2008-09-05T14:15:14.643 回答
0

大桌子是做什么的。

如果要拆分它,您有几个选择:
- 使用数据库系统拆分它(对此不太了解)
- 按行拆分。
- 按列拆分。

只有当您的数据可以很容易地分成块时,才能按行拆分它。例如,像Basecamp这样的东西有多个完全独立的帐户。您可以将 50% 的帐户保留在一个表中,将 50% 的帐户保留在不同机器上的不同表中。

按列拆分适用于行大小包含大文本字段或 BLOBS 的情况。如果您有一个包含(例如)用户图像和一大块文本的表格,您可以将图像农场到一个完全不同的表格中。(在不同的机器上)

你在这里打破了规范化,但我认为它不会导致太多问题。

于 2008-09-05T14:35:53.300 回答
0

您最终可能希望拆分该大表。在考虑第二台服务器之前,您可能希望将其放在单独的硬盘上。使用 MySQL 是最方便的选择。如果有能力,那就去吧。

一切都取决于你的数据库是如何被使用的,真的。统计数据。

于 2008-09-22T20:59:37.080 回答