如何处理 MySQL 数据库中的大量数据?
Posted
技术标签:
【中文标题】如何处理 MySQL 数据库中的大量数据?【英文标题】:How to handle large amounts of data in MySQL database? 【发布时间】:2014-06-04 10:26:28 【问题描述】:背景
我花了几天时间试图弄清楚我应该如何在 mysql 中处理大量数据。我为该软件的新服务器选择了一些程序和技术。我可能会使用运行 nginx、Percona Server 的 Ubuntu 14.04LTS,并将 TokuDB 用于我计划的 3 个表,并将 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 年时,所有 小时 数据将被删除,每日平均值将存储在 measure_day 表中。
问题
这是否被认为是这样做的好方法?还有什么需要考虑的吗?表分区怎么样,我应该这样做吗?我应该如何执行将日期拆分为不同的表?触发器和过程?
编辑:我的想法
您知道 MonetDB 或 Infobright 是否对此有用?
【问题讨论】:
是的,但正如 OP 中所述。我打算计算旧数据的平均值并仅存储平均值。所以实际上我会少很多。 【参考方案1】:我有一些建议,还有一些问题。
您尚未在表上定义主键,因此 MySQL 将自动创建一个。假设您打算将“id”作为主键,则需要将所有表创建语句中的行更改为“id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY”。
李>您尚未在表上定义任何索引,您打算如何查询?如果没有索引,所有查询都将是全表扫描,并且可能非常慢。
最后,对于这个用例,我会对表进行分区,以便快速轻松地删除旧数据。
【讨论】:
我忘记在这个示例中添加 PK 和索引。 sensor_id 将被索引,并且 id 在每个表上都是 PK。我也确实认为分区可能会使我受益。 现在更有意义了。 TokuDB 非常适合这种工作负载,因为您将实现高插入速度和压缩。【参考方案2】:我以前必须以每小时近一百万行的速度解决这类问题。
一些提示:
引擎Mysam。您无需使用该表更新或管理事务。您将插入、选择值并最终将其删除。
小心索引。就我而言,插入至关重要,有时 Mysql 队列中充满了待处理的插入。如果您的表有更多索引,则插入会花费更多时间。索引取决于您的计算值以及您打算何时执行此操作。
分片您的缓冲表。我只在表格准备好时触发计算值。当我在buffer_a
表中计算我的a
值时,这是因为插入在buffer_b
1 上。就我而言,我每天都计算值,所以我每天都切换目标表。事实上,我转储了所有数据并将其导出到另一个数据库中以生成平均值和其他过程,而不会干扰插入。
我希望这对您有所帮助。
【讨论】:
据我所知,在这种情况下,TokuDB 会以各种可能的方式击败 Myisam。 TokuDB 应该有更快的读取速度并使用更少的资源。这里有一些基准:mysqlperformanceblog.com/2009/11/05/…以上是关于如何处理 MySQL 数据库中的大量数据?的主要内容,如果未能解决你的问题,请参考以下文章