关于MySQL分区/分片/拆分:MySQL分区/分片/拆分-走哪条路?

关于MySQL分区/分片/拆分:MySQL分区/分片/拆分-走哪条路?

MySQL Partitioning / Sharding / Splitting - which way to go?

我们拥有一个大约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。

当前的硬件设置:

  • 惠普ProLiant DL 580
  • 4个Intel(R)Xeon(R)CPU E7- 4830
  • 256 GB内存

此设置的性能很好。


一旦该42 GB表不再适合内存,您肯定会开始遇到问题。实际上,一旦它不再适合内存,性能就会迅速下降。一种测试方法是将该表放在内存较少的另一台计算机上,并查看其性能如何。

First of all, it doesn't matter as much splitting out tables unless you also move some of the tables to a separate physical volume.

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

举例来说,假设您正在使用日期范围在大表上运行SELECT查询。如果表是完整的,查询将被迫扫描整个表(以这种大小,即使使用索引也可能很慢)。分区的优点是查询将仅在绝对必要的分区上运行。如果每个分区的大小为1 GB,而您的查询只需要访问5个分区即可满足要求,那么合并的5 GB表对于MySQL来说要比42 GB的怪物版本容易得多。

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

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

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


如果您认为自己将受到IO /内存的限制,那么我认为分区将无济于事。像往常一样,首先进行基准测试将帮助您找出最佳方向。如果您没有配备64GB内存的备用服务器,则可以随时向供应商索取"演示单元"。

如果您不希望有1个查询汇总报告,则我倾向于分片。我假设您将分片整个数据库,而不仅仅是大表:最好将整个实体保持在一起。好吧,无论如何,如果您的模型能够很好地拆分。


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

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

希望对您的情况有所帮助。


我会选择MariaDB InnoDB +分区(按键或按日期,具体取决于您的查询)。

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

数秒之内即可将MySQL替换为MariaDB ...所有数据库文件保持不变。


前不久在Microsoft ArcReady事件中,我看到了有关可能对您有用的缩放模式的演示。您可以在线查看幻灯片。


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

实际上,一切都取决于数据库的使用方式。统计。


As usual, benchmarking first will help you figure out the best direction.

那就是大多数人告诉我的,所以我认为我最终将不得不服用该药...


大桌子做什么?

如果要拆分它,则有几种选择:
-使用数据库系统对其进行拆分(对此了解不多)
-按行拆分。
-按列拆分。

仅当您的数据可以轻松地分成多个块时,才可以按行拆分它。例如诸如Basecamp之类的东西有多个完全独立的帐户。您可以将50%的帐户保留在一个表中,并将50%的帐户保留在另一台计算机上的另一个表中。

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

您在这里破坏了规范化,但是我认为这不会引起太多问题。


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

其次,不一定要移动最大物理尺寸的表。您可能有一个较小的表,可以进行更多活动,而大表保持相当恒定或仅附加数据。

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


推荐阅读

    linux进程运行命令?

    linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

    linux运行vim命令?

    linux运行vim命令?,系统,工具,官方网站,模式,基础,数据,代码,环境,入口,命令

    linux监控命令运行?

    linux监控命令运行?,系统,工作,地址,信息,工具,情况,标准,环境,命令,状态,lin

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux自动运行命令?

    linux自动运行命令?,服务,系统,时间,代码,周期性,第一,命令,管理,在线,状态,l

    linux开启运行命令?

    linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,lin

    linux运行wps命令?

    linux运行wps命令?,软件,官网,名称,时间,电脑,系统,工具,环境,项目,数据,wps

    linux运行cmd命令?

    linux运行cmd命令?,电脑,系统,状态,情况,环境,命令,单位,管理,设备,数据,电脑

    linux建立数据库命令?

    linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

    linux运行两个命令?

    linux运行两个命令?,网络,地址,系统,工作,暂停,命令,网站,密码,网上,入口,Lin

    linux清空表数据命令?

    linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,L

    linux下拆分打包命令?

    linux下拆分打包命令?,系统,名称,工具,标准,命令,文件,指令,表示,目录,结尾,

    linux拷贝数据命令?

    linux拷贝数据命令?,系统,地址,文件,数据,命令,目录,服务,基本知识,项目,密

    linux命令运行代码?

    linux命令运行代码?,代码,单位,系统,环境,连续,保险,工具,命令,文件,音乐,Lin

    linux命令运行脚本?

    linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运

    linux上运行的命令?

    linux上运行的命令?,系统,工作,软件,网络,地址,信息,情况,命令,灵活,基础知

    linux怎么运行命令?

    linux怎么运行命令?,系统,工作,首页,工具,终端,地址,命令,信息,电脑,情况,怎

    linux右击运行命令?

    linux右击运行命令?,系统,工作,设备,标准,首页,发行,电脑,终端,命令,文件,lin