归档 MySQL 表数据(海量数据)的最佳方式

Muk*_*ngh 2 mysql database database-design data-warehouse

所以这是故事。

表模式

item ` `on_date` `value1` `value2` `value3` `value4` ... `value10`   
Run Code Online (Sandbox Code Playgroud)

所有值都是我表中的重要参数,每天为每个项目存储。我每天捕获 100,000 行的数据,而这些数据在一个月内会变成大约 3,000,000 行。

该表很好,因为创建了索引和键来处理数据,我没有问题,因为我在 30 天后不断删除数据。

现在,我想将我删除的数据存储在一个纯粹用于历史数据分析的 MySQL 表中。

所以,我尝试了一种技术将所有列连接成 1 列并存储在一个用管道分隔的表中 | .

item | on_date |value1 | value2 .....| value10  
Run Code Online (Sandbox Code Playgroud)

但这并不能解决问题,而且数据量很大。

我浏览了社区和 MySQL 文档,但没有任何帮助。请建议我解决我的问题的最佳模式或技术。

Ric*_*mes 11

不清楚你在问什么。

“归档”是指将数据复制到别处,然后从这里删除

“备份”是指将数据复制到别处,但保留在这里。

你说你想“存储数据”,然后“删除”它并将其用于“历史......”。如果删除了,如何使用?也许您的意思是您已将其从主表中“归档”到另一个表中?

情况 1:每天备份,30 天后存档或删除。请参阅分区和备份。

案例2:只保留一天。嗯,一种方法是使用案例 1,但如果每天都做,则改为每小时做一次。

案例 3:您有两个表:当前 30 天,加上一个更大的旧数据表。这可能涉及分区和“可传输表空间”。

分区:参见http://mysql.rjweb.org/doc.php/partitionmaint (参见案例 1 和 4)

备份:参见 mysqldump(在手册中)或 Xtrabackup(Percona.com)

请注意,可以这样做

INSERT INTO db2.History
    SELECT * FROM db1.Current
        WHERE ...
Run Code Online (Sandbox Code Playgroud)

这会将行从一个数据库中的一个表复制到另一个数据库中的一个表。然而,分区和使用“可传输表空间”在分区上移动会快得多。

(我的意见:) 一个月内 300 万行(第 86 个百分位数)是“中等”大小的。一年后(第 94 个百分位数),我可能会称它为“大”,但还不是“巨大”。

(评论后...)

计划 A - 零中断

可能 pt-archiver 将是将几个月前的数据删除到其他机器的核心工具。(另见http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

计划 B - 转换为分区

这涉及向表添加分区的主要一次性中断。好处是剥离一个月的数据几乎没有影响。

决定归档前多长时间,按周或月分割,这样你就有大约 20-50 个分区。然后我们使用“可传输表空间”来断开最旧的分区以移动到另一台机器。并REORGANIZE PARTITION每周或每月添加一个新分区。一些细节在上面的第一个链接中。

请注意,在添加(或删除)时需要重新考虑索引PARTITIONing。建议您对大量数据进行试验,以确保获得最佳索引。(如果你想在这里讨论它,开始一个新问题并包括主要查询,加上SHOW CREATE TABLE现在和添加之后PARTITION BY RANGE(..)。)

  • @Nicholas - 我在回答中做出了回应。 (2认同)