如何在MySQL数据库中处理大量数据?

时间:2014-06-04 10:26:28

标签: mysql database-design bigdata database-partitioning tokudb

背景

我花了几天时间试图找出如何在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 会对此有什么好处吗?

2 个答案:

答案 0 :(得分:2)

我有一些建议,还有其他问题。

  1. 您还没有在表上定义主键,因此MySQL会自动创建一个主键。假设你的意思是&#34; id&#34;要成为您的主键,您需要将所有表创建语句中的行更改为&#34; id bigint(20)NOT NULL AUTO_INCREMENT PRIMARY KEY,&#34;。

  2. 您还没有在表上定义任何索引,您如何计划查询?没有索引,所有查询都将是全表扫描,可能非常慢。

  3. 最后,对于这个用例,我对表进行分区,以便快速轻松地删除旧数据。

答案 1 :(得分:0)

我之前必须解决这种类型的问题,每小时接近一百万行。

一些提示:

引擎 Mysam 。您不需要更新或管理该表的事务。您将要插入,选择值,并最终删除它。

小心索引。在我的情况下,插入很关键,有时Mysql队列充满了挂起的插入。如果表具有更多索引,则插入会花费更多时间。索引取决于您的计算值以及何时执行。

分片您的缓冲表。我只在表准备就绪时触发计算值。当我计算a表中的buffer_a值时,因为插入位于buffer_b一个。在我的情况下,我每天计算值,所以我每天都会切换目标表。实际上,我将所有数据转储并导出到另一个数据库中以进行平均,而其他过程不会干扰插入。

我希望你觉得这很有帮助。