mysql - 归档 MySQL 表数据(大数据)的最佳方式

标签 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 文档。 请建议我什么可能是解决我的问题的最佳模式或技术。

最佳答案

不清楚你在问什么。

“存档”意味着将数据复制到其他地方,然后从此处删除

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

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

案例一:每日备份,存档或30天后删除。请参阅分区和备份。

案例二:只保留一天。好吧,一种方法是使用案例 1,但如果每天都做,则每小时做一次。

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

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

备份:参见 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(..) 之后。)

关于mysql - 归档 MySQL 表数据(大数据)的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46383824/

相关文章:

sql - 我将如何构建用于接收销售订单的数据库?

asp.net - 您让 Sitecore(或其他 CMS)管理多少?

mysql - 检查两个时间是否重叠(如果它们在同一天)

php - PrestaShop 验证程序 : SQL security issues

php - ajax-heavy Apache+Mysql+PHP站点的服务器优化

mysql - 从平均值中选择平均值

mysql - 我的数据库表上的并发更新有问题

mysql - 如果可能的话,如何诊断长时间运行的事务并保存数据?

database - 在数据库列中存储分隔列表真的那么糟糕吗?

mysql - 表别名不适用于连接