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

我目前知道的 Select 是

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

我们的应用程序是基于J2EE和EJB2.1构建的(希望有一天我们会切换到EJB3).

你有什么建议?

编辑(2011-02-11):

编辑(2014-06-04):

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

编辑(2016-01-18):

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

当前硬件设置:

  • HP ProLiant DL 580
  • 4个英特尔(R)至强(R)CPU E7-4830
  • 256 GB内存

此设置的性能良好.

推荐答案

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

如果你不期望1个查询聚合报告,我会倾向于切分.我假设您要分割整个数据库,而不仅仅是您的大表:最好将整个实体保持在一起.不管怎样,如果你的模型能很好地分开.

Mysql相关问答推荐

SQL Store Procedure Throwing [42000][1064]您在EXECUTE stat USING声明上的SQL语法中有错误

在联合查询中使用GROUP BY和ORDER BY

WordPress的sql命令从帖子中删除随机文本

时间戳上滚动窗口的 SQL 计数不同

go&mysql&docker 拒绝连接

如何从具有第一行列值的表中 Select 客户的最新记录

如何 Select 具有最新的 2 个日期字段的行?

使用另一个表中的值更新一个表中的值

提取 MySQL 5.7 连续值的差异

使用数据表的直方图(SQL 查询)

如何使用 SQL 聚合和求和相似 Select 的值?

如何在 MYSQL 中使用多个表进行插值

mySQL 中的主数据库和 IF 错误?

MySQL:使用来自查询的信息创建一个新表

MySql - 默认情况下主键是唯一的吗?

MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

MySQL Partitioning / Sharding / Splitting - 走哪条路?

PHP MySQLI 防止 SQL 注入

在 MySQL 中找不到 outfile 创建的文件

在 MySQL 中存储 IPv6 地址