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

时间:2017-09-23 20:07:15

标签: mysql database database-design data-warehouse

所以这是故事。

表格式

item ` `on_date` `value1` `value2` `value3` `value4` ... `value10`   

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

表格很好,因为创建索引和键来处理数据,我没有问题,因为我会在30天后继续删除数据。

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

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

item | on_date |value1 | value2 .....| value10  

但是这个问题解决了这个问题并且数据非常庞大。

我浏览社区和MySQL文档时没有多大帮助。 请建议我解决问题的最佳模式或技术。

1 个答案:

答案 0 :(得分:4)

目前还不清楚你在问什么。

“存档”表示将数据复制到其他位置,然后从此处删除

“备份”表示将数据复制到其他位置,但保留在此处。

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

案例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 ...

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

(我的意见:)一个月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(..)。)