2

背景

我花了几天时间试图弄清楚我应该如何在 MySQL 中处理大量数据。我为该软件的新服务器选择了一些程序和技术。我可能会使用运行 nginx、Percona Server的 Ubuntu 14.04LTS,并将对我计划的 3 个表使用 TokuDB,对其余表使用InnoDB 。

但我的主要问题仍未解决。如何处理数据库中的海量数据?

数据

我对可能接收的数据的估计是每年 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 个月大后,将从分钟表中删除。然后平均值将从分钟值计算并插入到测量小时表中。然后,当数据存在 1 年时,所有小时数据都将被删除,每日平均值将存储在 measurement_day 表中。

问题

这被认为是这样做的好方法吗?还有什么需要考虑的吗?表分区怎么样,我应该这样做吗?我应该如何执行将日期拆分为不同的表?触发器和程序?

编辑:我的想法

知道MonetDBInfobright是否对此有用吗?

4

2 回答 2

3

我有一些建议,还有更多问题。

  1. 你还没有在你的表上定义一个主键,所以 MySQL 会自动创建一个。假设您打算将“id”作为主键,则需要将所有表创建语句中的行更改为“id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY”。

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

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

于 2014-06-04T11:12:28.137 回答
0

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

一些技巧:

引擎Mysam。您无需使用该表更新或管理事务。您将插入、选择值并最终将其删除。

小心索引。就我而言,插入至关重要,有时 Mysql 队列中充满了待处理的插入。如果您的表有更多索引,则插入会花费更多时间。索引取决于您的计算值以及您打算何时执行此操作。

对缓冲表进行分片。我只在表格准备好时触发计算值。当我在表格中计算我的a值时buffer_a,这是因为插入是buffer_b一个。就我而言,我每天都计算值,所以我每天都切换目标表。事实上,我转储了所有数据并将其导出到另一个数据库中以生成平均值和其他过程,而不会干扰插入。

我希望你觉得这有帮助。

于 2014-06-04T11:09:37.313 回答