这就是故事。
表格模式
item ` `on_date` `value1` `value2` `value3` `value4` ... `value10`
所有的值都是我表中的重要参数,它们每天都存储在每个项目中。每天我捕获100000行的数据,然后在一个月内变成大约3000000行。
该表很好,因为索引和键被创建来处理数据,并且我没有问题,因为我在30天后保持删除数据。
现在,我想将我删除的数据存储在一个mysql表中,该表将纯粹用于历史数据分析。
所以,我尝试了一种技术,将所有列连接成一列,并用管道分隔存储在一个表中。
item | on_date |value1 | value2 .....| value10
但这并不能解决问题,而且数据非常庞大。
我浏览了社区和mysql文档,没有什么帮助。
请告诉我什么是解决我问题的最佳模式或技术。
最佳答案
不清楚你在问什么。
“存档”是指将数据复制到其他地方,然后从这里删除。
“备份”是指将数据复制到其他地方,但保留在这里。
你说你想“存储数据”,然后“删除”它并将其用于“历史…”。如果它被删除了,你如何使用它?也许你是说你已经把它从主表“归档”到另一个表中了?
案例1:每天备份,30天后存档或删除。请参阅分区和备份。
案例二:只保留一天。好吧,一种方法是使用案例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
)关于mysql - 归档MySQL表数据(海量数据)的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46383824/