MySQL分区/分片/分割 - 哪条路要走?
我们有一个大约70GB的InnoDB数据库,我们预计它在未来的2到3年内会增长到几百GB。大约60%的数据属于单个表格。目前数据库运行良好,因为我们有一个64 GB RAM的服务器,所以几乎整个数据库都可以存储到内存中,但是当数据量会大得多时,我们担心未来。现在我们正在考虑某种方式来分割表格(特别是占数据最大部分的表格),现在我想知道,最好的方法是什么。MySQL分区/分片/分割 - 哪条路要走?
选项我目前知道的是
- 使用自带的版本5.1
- 使用某种类型的第三方库的封装了数据的分区(如Hibernate碎片) MySQL分区
- 自己实现它我们的应用程序内
我们的应用是建立在J2EE和EJB 2.1(希望我们切换到EJB 3的某一天)。
你会建议什么?
编辑(2011-02-11):
只是一个更新:目前数据库的大小是380 GB,我们的“大”表的数据大小是220 GB,其索引的大小是36 GB 。因此,尽管整个表格不再适合记忆,但索引确实如此。
系统仍然运行良好(仍然在同一个硬件上),我们仍在考虑对数据进行分区。
编辑(2014-06-04): 另一个更新:整个数据库的大小是1.5TB,我们的“大”表的大小是1.1TB。我们将服务器升级到具有128 GB RAM的4处理器机器(Intel Xeon E7450)。 该系统仍然运行良好。 我们接下来要做的是将我们的大表放在一个单独的数据库服务器上(我们已经对我们的软件进行了必要的更改),同时升级到具有256 GB RAM的新硬件。
此设置应该持续两年。然后,我们要么终于开始实施分片解决方案,要么只购买带有1TB内存的服务器,这应该让我们保持一段时间。
EDIT(2016年1月18日):
我们自把我们的大表在它自己的数据库的单独服务器上。目前该数据库的大小约为1.9TB,其他数据库的大小(除“大”之外的所有表)为1.1TB。
当前硬件设置:
- 的HP ProLiant DL 580
- 4×英特尔(R)至强(R)CPU E7-4830
- 256 GB RAM
性能优良用这个设置。
如果你认为你将要IO /内存绑定,我不认为分区会有帮助。像往常一样,首先进行基准测试将帮助您找出最佳方向。如果您没有配备64GB内存的备用服务器,您可以随时向供应商索取“演示单元”。
如果您不期望1个查询汇总报告,我会倾向于分片。我假设你会分解整个数据库,而不仅仅是你的大桌子:最好把整个实体放在一起。好吧,无论如何,如果你的模型分裂的很好。
首先,除非您还将某些表格移动到单独的物理卷上,否则分割表格并不重要。其次,它不一定是你想移动的物理尺寸最大的表格。你可能有一个小得多的表获得更多的活动,而你的大表仍然是相当稳定的,或者只是附加数据。
不管你做什么,都不要自己去实现。让数据库系统处理它。
大表做什么。
如果你要拆呢,你有几种选择:
- 由行分割它 - 使用的数据库系统(不知道很多有关)
拆分它。
- 按列分割。
只有在您的数据可以很容易地分成块的情况下,才能将它按行拆分。例如像Basecamp这样的东西有多个完全分开的账户。您可以在一个表中保留50%的帐户,在另一台机器上保留50%的帐户。
按列拆分适用于行大小包含大型文本字段或BLOBS的情况。如果你有一个带有(例如)用户图像和大块文本的表格,你可以将图像放入一个完全不同的表格。 (在不同的机器上)
你在这里打破标准化,但我不认为这会造成太多问题。
像往常一样,基准首先会帮助您找出最佳方向。
这就是大多数人告诉我,所以我认为我将最终不得不采取丸...
你可能会想最终拆分大表。在考虑第二台服务器之前,您可能需要将其放在单独的硬盘上。用MySQL来做是最方便的选择。如果它有能力,那就去做吧。
但是
一切都取决于您的数据库是如何使用,真的。统计。
一旦它不再适合内存,您肯定会开始在42 GB表中遇到问题。事实上,一旦它不再适应内存,性能将会非常快地降低。测试的一种方法是将该表放在另一台RAM较少的计算机上,并查看其执行效果差。
首先,除非您还将某些表格移动到单独的物理卷上,否则分开表格并不重要。
这是不正确的。分区(通过MySQL 5.1中的功能,或者使用MERGE表格的功能)可以提供显着的性能优势,即使这些表位于同一个驱动器上。
举一个例子,假设您使用日期范围在大表上运行SELECT查询。如果表是完整的,则查询将被强制扫描整个表(并且在该大小下,即使使用索引也可能很慢)。分区的优势在于您的查询只能在绝对有必要的分区上运行。如果每个分区的大小为1 GB,并且查询只需要访问5个分区以实现自身功能,那么组合的5 GB表比MySQL更容易处理,而不是42 GB的怪兽版本。
你需要问自己的一件事是你如何查询数据。如果您的查询有可能只需访问某些数据块(即日期范围或ID范围),则某种分区将证明是有益的。
我听说MySQL 5.1分区还存在一些问题,特别是与MySQL选择正确密钥有关的问题。 MERGE表可以提供相同的功能,但它们需要稍微更多的开销。
希望能帮助你...祝你好运!
这是一个什么能MySQL分区中的海量数据的真实生活中的例子做一个很好的例子流:
希望它成为你的情况有帮助。
我会去MariaDB InnoDB +分区(按键或按日期,具体取决于您的查询)。
我做了这个,现在我没有任何数据库问题了。
MySQL可以在几秒钟内被MariaDB替换...所有的数据库文件保持不变。
只需在2 - 3年内获得更多内存,或者立即使用固态硬盘。一旦你花了几百美元这样做,然后考虑优化。 – Kurt 2009-03-12 01:38:18
你能否再次更新当前状态? – 2013-02-15 04:27:38
这有什么新东西?哪种解决方案已被使用? – Benj 2013-06-12 08:54:06