我花了几天时间试图找出如何在MySQL中处理大量数据。我为该软件的新服务器选择了一些程序和技术。我可能会使用运行nginx的Ubuntu 14.04LTS, Percona Server ,并将使用 TokuDB 表示我计划的3个表,将InnoDB用于其余表。< / p>
但是我还没有解决主要问题。如何处理数据库中的大量数据?
我对可能收到的数据的估计是<每年5亿行 。我将每 4分钟从传感器接收测量数据。
插入速度不是很关键,但我希望能够在1-2秒内选择几百个测量值。所需资源量也是一个关键因素。
现在我想到将传感器数据分成3个表。
修改: 在每张桌子上:
id = PK,AI
sensor_id将被编入索引
CREATE TABLE measurements_minute(
id bigint(20),
value float,
sensor_id mediumint(8),
created timestamp
) ENGINE=TokuDB;
CREATE TABLE measurements_hour(
id bigint(20),
value float,
sensor_id mediumint(8),
created timestamp
) ENGINE=TokuDB;
CREATE TABLE measurements_day(
id bigint(20),
value float,
sensor_id mediumint(8),
created timestamp
) ENGINE=TokuDB;
所以我将这个 4分钟数据存储一个月。在数据为1个月之后,它将从分钟表中删除。然后将从分钟值计算平均值并将其插入measured_hour表中。然后,当数据为1年时,所有小时数据都将被删除,每日平均值将存储在measurements_day表中。
这被认为是一种很好的方法吗?还有什么需要考虑的吗?表分区怎么样,我应该这样做吗?我该如何执行将日期拆分到不同的表中?触发器和程序?
任何想法 MonetDB 或 Infobright 会对此有什么好处吗?
答案 0 :(得分:2)
我有一些建议,还有其他问题。
您还没有在表上定义主键,因此MySQL会自动创建一个主键。假设你的意思是&#34; id&#34;要成为您的主键,您需要将所有表创建语句中的行更改为&#34; id bigint(20)NOT NULL AUTO_INCREMENT PRIMARY KEY,&#34;。
您还没有在表上定义任何索引,您如何计划查询?没有索引,所有查询都将是全表扫描,可能非常慢。
最后,对于这个用例,我对表进行分区,以便快速轻松地删除旧数据。
答案 1 :(得分:0)
我之前必须解决这种类型的问题,每小时接近一百万行。
一些提示:
引擎 Mysam 。您不需要更新或管理该表的事务。您将要插入,选择值,并最终删除它。
小心索引。在我的情况下,插入很关键,有时Mysql队列充满了挂起的插入。如果表具有更多索引,则插入会花费更多时间。索引取决于您的计算值以及何时执行。
分片您的缓冲表。我只在表准备就绪时触发计算值。当我计算a
表中的buffer_a
值时,因为插入位于buffer_b
一个。在我的情况下,我每天计算值,所以我每天都会切换目标表。实际上,我将所有数据转储并导出到另一个数据库中以进行平均,而其他过程不会干扰插入。
我希望你觉得这很有帮助。