MySQL:具有较高更新频率的非常大集合的表组织

我在select我的MySQL模式应用程序时面临着两难的境地。 所以在我开始之前我的数据库是非常简化的一张图片:

架构在这里: http : //i43.tinypic.com/2wp5lxz.png

一句话:对于每个客户,应用程序收集每个收集的数据的文本数据和附加的标签。

作为每个表的使用近似,这是我所期望的:

  • 顾客:〜5000,不宜长得快
  • 数据:每个客户500万,可能是大客户的两倍或三倍。
  • 标签:〜1000,相当固定的大小
  • data_tag:每个用户容易上亿。 每个数据可以被标记很多。

收获过程是永久性的,这意味着大约每15分钟新的数据就会被标记出来,这就需要一个非常持续的索引刷新。

我的很多查询是特定date之间的数据select计数,并在特定的客户上标记了特定的标记(很less涉及多个客户)。

这里是情况,你可以想象这种数据量我正面临数据组织和索引方面的挑战。 再一次,这是我的结构极简版和简化的版本。 我的问题是,是否更好:

  1. 坚持这个模式,并pipe理疯狂的指数优化? (其中涉及data_tag表中可能有数十亿行)
  2. 更改架构并为每个客户使用一个数据表和一个data_tag表? (这涉及到我的数据库有5000个表)

我正在MySQL 5.0专用服务器(四核,RAM的8Go)上运行所有这一切。 我只使用InnoDB,我也有另一台运行Sphinx的服务器。 所以知道这一切,我迫不及待地听到你的意见。

谢谢。


编辑

感谢你的回答,我意识到这个数字有多疯狂。 所以这里是一个更新的更现实的用法(基于实际的服务器,只是一个基本的rackspace框)。

  • 顾客:2000(固定)
  • 数据:每个客户100万(固定,存档旧数据,非常不公平:一些客户有几千,最大500万)
  • 标签:1000(固定)
  • data_tag:每个客户大约三五百万(取决于数据,太不公平了)。

谢谢。

基于我使用MySQL多年的经验,我的2分钱是你的后一种select听起来更合乎逻辑和现实。

每个客户使用一个数据和一个data_tag比您当前的模式具有更简单的整体可pipe理性。 第二个选项的编码也会更简单。

你可以问更多的MySQL专家; 你的第二个select是最好的。

如果你喜欢,我可以详细说明,这是一个简单的问题,一个大问题的简单答案。 它是双向的

除了你在这里提到的东西外,不知道你的应用程序有多less,这是很难说的。 你的数据模型非常简单,这就是你所期待的,从字面上看,数十亿行。 我会避免创build5k以上的表,因为如果你尝试的话,你可能会遇到文件描述符问题和caching限制。

当然,你可能会限制/configuration它们,它仍然不是一个最佳的configuration。

你是否也在非关键数据上创build索引? 这些名称列,例如? 这可能会降低写入性能,使您的15分钟批量作业得到备份。

坦率地说,如果这是我的申请,我会考虑两个潜在的解决scheme:

  1. 如果性能成为一个问题,那么现在就去使用你现有的function,并在多个MySQL服务器之间分割客户 除非你有这些数据,这些客户排队,这还不算什么问题。 不要花太多时间devise“如果”。 坚持简单的模式,并将您的第一批用户介绍给第一台服务器。 当你开始获得容量时,引入第二台服务器并将这些新用户隔离到该数据库。 可以这么说。 通过资源监控和良好的pipe理技术进行备份,以便知道何时“处于能力”线路正在接近。

  2. 会像Cassandra或MongoDB的工作? 我不太了解你的问题,build议或排除。 MongoDB可能是一个选项。 值得检查。

所以,我想简而言之,让MySQL做它做得好的,只是运行更多。 或者,如果可能的话,看看像Mongo这样的东西。

嗯,从我的经验来看 – 你确定MySQL甚至是最好的数据库吗? 试图看看甲骨文或SQL Server(虽然oracle群集可能在这里有一个优势)?

如果你认为许可成本会杀了你,让我只是说,你没有一个想法,但你需要什么硬件来运行它。 一旦你获得了SAN所需的第一个服务,你可能会嘲笑相应软件的价格。

只是一个想法。

  • 客户 – 让我们说10.000,因为你指责它会快速增长。
  • 数据 – 让我们假设一个普通客户700万。 数据表已经有70亿行。 是的,对不起,这4个零都真的加了起来。
  • 如果每个数据得到10个标签(你什么都不指定),那么data_tag字段的数据就会接近700亿行。

得到更疯狂的

  • 如果DataTag没有索引,也没有开销(它有),data:tag是每个条目10个字节 – tag_id是2(65536就足够了),可悲的是8个data_id – 你不能处理4个字节的700亿条目。 这是总共大约7800千兆字节的原始数据(700.000.000.000 * 12/1024/1024/1024)。 索引可能性加倍。

为了有效地处理这是一个高端的SAN。 在这里我们不谈论“10张光盘”,我们谈到高端SAN可能有400张光盘,以便处理所有这些数据 – 不要忘记,到目前为止,我们并没有真正的任何指标。

我正在MySQL 5.0专用服务器(四核,RAM的8Go)上运行所有这一切。

不错的尝试。 这对于什么是好的? 不好意思问,但8GB内存不会真的帮助(没有留下深刻的印象),去一个256GB的机器…这可能需要AMD和其中一个非常昂贵的Opteron 8000.但是你将需要内存。

无论如何,这将是(我怀疑你是否恰当地代表事实),这是世界上最大的数据库安装之一。

您肯定希望能够处理的东西 – 如果您真的必须这样做,Oracle集群或SQL Server集群可能会加快速度。 这是免费数据库甚至可以想到的处理方式。 真。

你需要适当的备份程序(MySQL缺乏)。 你也可能喜欢SQL服务2008年数据页面压缩,这可能会减less约50%的数据大小在光盘上。 不仅节省了成本,而且因为这意味着更less的IO – 这直接转化为更多的性能(因为你不能在内存中caching表)。

尽pipe我讨厌这么说,但您也可能想要考虑在一台漂亮的大型机上使用IBM DB2,而且我并不是指在其上运行Linux VM。 由于硬件体系结构的原因,VMS在处理超大规模数据库方面非常优越。 不要问价格;)