过去 3 个月的 MariaDB 分区

MariaDB partitionning last 3 month

首先说明一下我的问题:

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

我在 MariaDB v10.1.12 上工作。

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

你对我有什么想法吗?也许是分区之外的另一种解决方案。

提前致谢。

Table分区是一个高级特性,它不是索引,而是tables数据的重新排列。所以不是"duplicate",确实新的数据会按照预定义的分区范围存储。

您还必须像往常一样指定月份范围条件。如果这些列未用作分区范围,则必须创建索引。当您制作 select 时,与分区 table 关联的算法将在后台处理这些合并(如果需要)。因此,您只需像典型的 table 一样对待分区。

详情请查看Mariadb paritioning overview

我推荐PARTITION BY RANGE(TO_DAYS(...))如果你现在才把table分成分区,我建议今年之前对数据进行年度分区,然后是季度分区或以后每月分区。是的,这在理论上会导致无限数量的分区,但我预测您将在几年内改造数据结构。

20-50 个分区 是一个不错的数字。不仅如此,由于分区过多,还会导致效率低下;小于会导致询问 "why bother".

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

通常最好将date/timestamp列放在任何索引中last。把它放在第一位是多余的,因为分区修剪是第一位的。

More on partitioning.

听起来 table 的主要目的是总结数据以作图等。在这种情况下,构建和维护“总结table(s)" 在选定时间间隔内的计数和小计。 10 分钟的时间间隔加起来 100 行?如果是这样,那么基于 10 分钟间隔的摘要 table 将具有 1/100 的行数,并且查询将 快得多 。另外,您可以 'denormalize' 摘要 table 使它们更简单。

More on Summary tables.

可能 将 10 分钟的数据收集到阶段 table 中,然后将其汇总到摘要 table。并且还把原始数据丢进大table.

或者,如果摘要 table 包含您需要的一切,您可以 放弃大的 table。或者,作为折衷方案,保留 12 个月的数据(按月划分),DROP PARTITION 保留较旧的数据。同时,摘要 table 可以继续增长(尽管它们会小得多)。