过去 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 一样对待分区。
我推荐PARTITION BY RANGE(TO_DAYS(...))
如果你现在才把table分成分区,我建议今年之前对数据进行年度分区,然后是季度分区或以后每月分区。是的,这在理论上会导致无限数量的分区,但我预测您将在几年内改造数据结构。
20-50 个分区 是一个不错的数字。不仅如此,由于分区过多,还会导致效率低下;小于会导致询问 "why bother".
使用 InnoDB。仔细设计 PRIMARY KEY
,因为它可能用作数据的主要索引。
通常最好将date/timestamp列放在任何索引中last。把它放在第一位是多余的,因为分区修剪是第一位的。
听起来 table 的主要目的是总结数据以作图等。在这种情况下,构建和维护“总结table(s)" 在选定时间间隔内的计数和小计。 10 分钟的时间间隔加起来 100 行?如果是这样,那么基于 10 分钟间隔的摘要 table 将具有 1/100 的行数,并且查询将 快得多 。另外,您可以 'denormalize' 摘要 table 使它们更简单。
可能 将 10 分钟的数据收集到阶段 table 中,然后将其汇总到摘要 table。并且还把原始数据丢进大table.
或者,如果摘要 table 包含您需要的一切,您可以 放弃大的 table。或者,作为折衷方案,保留 12 个月的数据(按月划分),DROP PARTITION
保留较旧的数据。同时,摘要 table 可以继续增长(尽管它们会小得多)。
首先说明一下我的问题:
这是一个table,每年将包含大约 5,000,000 条记录,这些记录将至少保存 10 年(尚未定义)。我们谈论生产机器的事件。我生成了一个报告 + 一个仪表板,用于显示相对复杂的各种信息(每月每 10 分钟的平均事件数,图形,......)并且还想自己查看记录。显示的数据将是过去 2 个月的大部分数据,必须始终可以查看其余数据,但访问速度较低。
我在 MariaDB v10.1.12 上工作。
我的想法是在最近 3 个月内进行分区。我现在意识到这不是那么容易。我还没有找到任何解决这个分区的方法,事实上,不可能直接或间接地通过另一个计算列基于 now() 或其他 current_date() 等进行分区。
你对我有什么想法吗?也许是分区之外的另一种解决方案。
提前致谢。
Table分区是一个高级特性,它不是索引,而是tables数据的重新排列。所以不是"duplicate",确实新的数据会按照预定义的分区范围存储。
您还必须像往常一样指定月份范围条件。如果这些列未用作分区范围,则必须创建索引。当您制作 select 时,与分区 table 关联的算法将在后台处理这些合并(如果需要)。因此,您只需像典型的 table 一样对待分区。
我推荐PARTITION BY RANGE(TO_DAYS(...))
如果你现在才把table分成分区,我建议今年之前对数据进行年度分区,然后是季度分区或以后每月分区。是的,这在理论上会导致无限数量的分区,但我预测您将在几年内改造数据结构。
20-50 个分区 是一个不错的数字。不仅如此,由于分区过多,还会导致效率低下;小于会导致询问 "why bother".
使用 InnoDB。仔细设计 PRIMARY KEY
,因为它可能用作数据的主要索引。
通常最好将date/timestamp列放在任何索引中last。把它放在第一位是多余的,因为分区修剪是第一位的。
听起来 table 的主要目的是总结数据以作图等。在这种情况下,构建和维护“总结table(s)" 在选定时间间隔内的计数和小计。 10 分钟的时间间隔加起来 100 行?如果是这样,那么基于 10 分钟间隔的摘要 table 将具有 1/100 的行数,并且查询将 快得多 。另外,您可以 'denormalize' 摘要 table 使它们更简单。
可能 将 10 分钟的数据收集到阶段 table 中,然后将其汇总到摘要 table。并且还把原始数据丢进大table.
或者,如果摘要 table 包含您需要的一切,您可以 放弃大的 table。或者,作为折衷方案,保留 12 个月的数据(按月划分),DROP PARTITION
保留较旧的数据。同时,摘要 table 可以继续增长(尽管它们会小得多)。