MariaDB分区过去3个月

时间:2016-06-22 06:14:13

标签: mariadb partition

首先,我解释一下我的问题:

这是一张每年约包含5,000,000条记录的表格,这些记录将至少保存10年(尚未定义)。我们谈论生产机器的事件。我生成一个报告+一个仪表板,用于显示相对复杂的各种信息(每月每10分钟平均事件数,图形......),并且还希望自己查看记录。显示的数据将在过去2个月中占绝大多数,查看其余数据必须始终可行,但访问速度较低。

我在MariaDB v10.1.12上工作。

想法是在最近3个月进行分区。我现在意识到这并不容易。我没有找到任何这个分区的解决方案,事实上,不可能直接或间接通过另一个计算列来建立基于now()或其他current_date()等的分区。

你对我有什么想法吗?也许是另一个解决方案,而不是分区。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我建议 PARTITION BY RANGE(TO_DAYS(...)) 如果您现在只是将表分成了分区,我会建议今年之前的数据年度分区,然后是季度或月度分区。是的,从理论上讲,它会导致无限数量的分区,但我预测您将在几年内改进数据结构。

20-50分区是一个很好的数字。由于分区众多,导致效率低下的原因不止于此;不到这导致问“为什么要打扰”。

使用InnoDB。仔细设计 PRIMARY KEY ,因为它可能有用作数据的主要索引。

通常最好将日期/时间戳列最后 放在任何索引中。将它放在第一位将是多余的,因为分区修剪是第一次。

More on partitioning

这听起来像表格的主要目的是汇总图表等数据。在这种情况下,构建和维护“汇总表”可能非常有用。选定时间间隔内的计数和小计。 100行加起来间隔10分钟?如果是这样,那么基于10分钟间隔的汇总表将具有1/100的行数,并且查询将更多更快。另外,您可以对摘要表进行“非规范化”,使其更简单。

More on Summary tables

可能值得将10分钟的数据收集到临时表中,然后将其汇总到摘要表中。并将原始数据放入大表。

或者,如果摘要表包含您需要的所有内容,则可以放弃大表。或者,作为妥协,保留12个月的数据(按月分区),并DROP PARTITION用于旧数据。同时,汇总表可以继续增长(尽管它们会小得多)。

答案 1 :(得分:0)

表分区是一项先进的功能,它不是索引,而是重新排列表数据。因此它不会重复"确实会根据预定义的分区范围存储新数据。

您还必须像往常一样指定月份范围标准。如果那些列不用作分区范围,你必须创建索引。进行选择时,与分区表关联的算法将在后台处理那些合并(如果需要)。因此,您只需将分区视为典型表格。

有关详细信息,请查看Mariadb paritioning overview