【问题标题】:MariaDB partitionning last 3 monthMariaDB 分区最近 3 个月
【发布时间】:2016-07-02 07:04:10
【问题描述】:

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

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

我在 MariaDB v10.1.12 上工作。

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

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

提前谢谢你。

【问题讨论】:

  • 您的意思是要根据连续变化的值对表进行分区?我不明白为什么要经历那种麻烦。每月或每季度修复的分区表将在大多数使用情况下修复。
  • 谢谢,但这会生成“无限”分区。可以吗?没有问题吗?
  • 表分区是“自切片面包以来最好的东西”。请检查我的答案。您需要阅读有关数据库分区主题的更多信息,如果您有任何疑问,请询问它。
  • 我理解按月或按季度连续分区,但是如果我们想要数据,比如说从火星 15 日到 4 月 15 日,这意味着数据在 2 个不同的分区中,它仍然有效吗?

标签: mariadb partition


【解决方案1】:

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

20-50 个分区 是一个不错的数字。不仅如此,由于分区众多,还会导致效率低下;少于这会导致问“为什么要打扰”。

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

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

More on partitioning.

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

More on Summary tables.

可能将 10 分钟的数据收集到 暂存表,然后将其汇总到汇总表中。并且还将原始数据扔到大表中。

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

【讨论】:

    【解决方案2】:

    表分区是一项高级功能,它不是索引,而是重新排列表数据。所以它不是“重复的”,实际上新数据将根据预定义的分区范围存储。

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

    更多详情请查看Mariadb paritioning overview

    【讨论】:

    • 谢谢,我会继续分区。而且我已经为该列建立了索引。
    • 不过,这取决于您的数据结构。如果每一行都很大,那么你必须考虑去规范化。
    • 不,行不大。
    • 还有一些分区与索引的读取。两者都用。 dba.stackexchange.com/questions/45937/partitioning-vs-indexes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2022-01-17
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多