我在select我的MySQL模式应用程序时面临着两难的境地。 所以在我开始之前我的数据库是非常简化的一张图片:
架构在这里: http : //i43.tinypic.com/2wp5lxz.png
一句话:对于每个客户,应用程序收集每个收集的数据的文本数据和附加的标签。
作为每个表的使用近似,这是我所期望的:
收获过程是永久性的,这意味着大约每15分钟新的数据就会被标记出来,这就需要一个非常持续的索引刷新。
我的很多查询是特定date之间的数据select计数,并在特定的客户上标记了特定的标记(很less涉及多个客户)。
这里是情况,你可以想象这种数据量我正面临数据组织和索引方面的挑战。 再一次,这是我的结构极简版和简化的版本。 我的问题是,是否更好:
我正在MySQL 5.0专用服务器(四核,RAM的8Go)上运行所有这一切。 我只使用InnoDB,我也有另一台运行Sphinx的服务器。 所以知道这一切,我迫不及待地听到你的意见。
谢谢。
编辑
感谢你的回答,我意识到这个数字有多疯狂。 所以这里是一个更新的更现实的用法(基于实际的服务器,只是一个基本的rackspace框)。
谢谢。
基于我使用MySQL多年的经验,我的2分钱是你的后一种select听起来更合乎逻辑和现实。
每个客户使用一个数据和一个data_tag比您当前的模式具有更简单的整体可pipe理性。 第二个选项的编码也会更简单。
你可以问更多的MySQL专家; 你的第二个select是最好的。
如果你喜欢,我可以详细说明,这是一个简单的问题,一个大问题的简单答案。 它是双向的
除了你在这里提到的东西外,不知道你的应用程序有多less,这是很难说的。 你的数据模型非常简单,这就是你所期待的,从字面上看,数十亿行。 我会避免创build5k以上的表,因为如果你尝试的话,你可能会遇到文件描述符问题和caching限制。
当然,你可能会限制/configuration它们,它仍然不是一个最佳的configuration。
你是否也在非关键数据上创build索引? 这些名称列,例如? 这可能会降低写入性能,使您的15分钟批量作业得到备份。
坦率地说,如果这是我的申请,我会考虑两个潜在的解决scheme:
如果性能成为一个问题,那么现在就去使用你现有的function,并在多个MySQL服务器之间分割客户 除非你有这些数据,这些客户排队,这还不算什么问题。 不要花太多时间devise“如果”。 坚持简单的模式,并将您的第一批用户介绍给第一台服务器。 当你开始获得容量时,引入第二台服务器并将这些新用户隔离到该数据库。 可以这么说。 通过资源监控和良好的pipe理技术进行备份,以便知道何时“处于能力”线路正在接近。
会像Cassandra或MongoDB的工作? 我不太了解你的问题,build议或排除。 MongoDB可能是一个选项。 值得检查。
所以,我想简而言之,让MySQL做它做得好的,只是运行更多。 或者,如果可能的话,看看像Mongo这样的东西。
嗯,从我的经验来看 – 你确定MySQL甚至是最好的数据库吗? 试图看看甲骨文或SQL Server(虽然oracle群集可能在这里有一个优势)?
如果你认为许可成本会杀了你,让我只是说,你没有一个想法,但你需要什么硬件来运行它。 一旦你获得了SAN所需的第一个服务,你可能会嘲笑相应软件的价格。
只是一个想法。
得到更疯狂的
为了有效地处理这是一个高端的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在处理超大规模数据库方面非常优越。 不要问价格;)