MYSQL - 数据库设计大规模实际部署

时间:2012-08-20 00:31:26

标签: mysql database-design

我很想听听有关mysql数据库设计的一些意见或想法。

基本上,我有一个tomcat服务器,可以从现场约1000个系统中收集不同类型的数据。这些系统中的每一个都是独一无二的,并且将报告唯一数据。

发送的数据可以归类为频繁和不频繁的数据。不频繁的数据每天只发送一次并且变化不大 - 它基本上只是基于配置的数据。

系统开启时,每2-3分钟发送一次频繁的数据。并代表系统的当前状态。

此数据需要针对每个系统进行数据库处理,并且可以在任何给定时间从php页面访问。本质上,对于该领域的任何系统,PHP页面都需要能够访问该客户端系统上的所有数据并显示它。换句话说,数据库需要显示系统的状态。

信息本身都是基于文本的,并且有很多信息。配置数据(变化不大)是键值对,目前大约有100个。

我对设计的想法是拥有100多列,每个系统有1行来保存配置数据。但我担心有这么多专栏,主要是因为如果我将来需要添加专栏,它不是太未来的证据。如果我这样做,我也担心插入速度。这可能会爆炸到2000row x 200柱表,每秒可以访问大约100次,所以我需要在初始设计中满足这一要求。

我也想知道,是否有任何设计理念可以满足频繁变化,并且很少根据引擎改变数据。这有意义,因为我想保持INSERT / UPDATE时间较短,而且我不太关心来自php的SELECT时间。

我也很想知道如何分割数据。即如果频繁变化的数据可以用几种不同的方式分类,我应该有一堆表,表示数据并将它们连接到选择上吗?我很担心这个,因为我可能需要做一个报告来显示所有系统之间的共同属性(即显示具有特定条件的所有系统)。

我希望我在这里提供足够的信息让某人指出我正确的方向,对此事的任何帮助都会很棒。或者,如果有人做了类似的事情并且可以提供建议,我将非常感激。谢谢堆:)

〜丹

1 个答案:

答案 0 :(得分:3)

我在评论中发布了一些问题。如果不了解您正在尝试做的事情,很难就快速变化的数据向您提供建议。

对于配置数据,请勿使用100列表。众所周知,宽桌很难处理。而是使用包含这些列的四列表:

SYSTEM_ID  VARCHAR    System identifier
POSTTIME   DATETIME   The time the information was posted
NAME       VARCHAR    The name of the parameter
VALUE      VARCHAR    The value of the parameter

这些列中的前三列是您的复合主键。

此设计的优点是,当您添加(或减去)配置参数集时,它会增长(或缩小)。它还允许存储历史数据。这意味着可以插入新数据点而不是UPDATEd,这更快。您可以运行每日或每周工作来删除您不再感兴趣的历史记录。

编辑 如果您真的不需要历史记录,请在发布内容时删除POSTTIME列并使用MySQL的良好扩展功能INSERT ON DUPLICATE KEY UPDATE。见http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

如果快速变化的数据在形式(名称/值对)上与配置数据类似,则可以使用类似的模式来存储它。

您可能希望使用MEMORY访问方法为此内容创建“当前数据”表。 MEMORY表的读写速度非常快,因为数据全部都在MySQL服务器的RAM中。缺点是MySQL崩溃和重启会给你一个空表,前面的内容丢失了。 (MySQL服务器很少崩溃,但是当它们发生故障时,它们会丢失MEMORY表内容。)

如果您需要保存历史记录,可以偶尔运行一个作业(每隔几分钟或几小时)将MEMORY表的内容复制到磁盘上。

编辑 :您可能会考虑将来向您的网络应用系统添加memcached http://memcached.org/以处理高读取率,而不是构建数据库处理高读取率的版本1的设计。这样你就可以看到整个应用程序设计的哪些部分无法扩展。我希望过去有人说服我这样做,而不是为早期版本过度设计。)