【问题标题】:MySQL Partition By DATEDIFFMySQL 分区按 DATEDIFF
【发布时间】:2020-12-22 09:28:48
【问题描述】:

我有一个带有 ReferenceDate 字段的表格。我打算使用该字段对其进行分区,如下所示:

  • partition_0:超过 1 年的值;
  • partition_1:超过 6 个月的值;
  • partition_2:超过 3 个月的值;
  • partition_3:过去 3 个月的值;

为此,我尝试了以下脚本来更改表格:

ALTER TABLE `MyTable`
        PARTITION BY RANGE (DATEDIFF(NOW(), `ReferenceDate`)) 
        (
            PARTITION p0_historic_data VALUES LESS THAN (90),
            PARTITION p1_intermediary_data VALUES LESS THAN (180),
            PARTITION p2_intermediary_data VALUES LESS THAN (365),
            PARTITION p3_current_data VALUES LESS THAN MAXVALUE 
        );

但是,我相信我不能使用 Now () 函数,在分区子句中,我能够做的是使用 TO_DATE,但它没有给我所需的回报,使用 DIFF 我有价值当前日期与 ReferenceDate 的差值,TO_DATE 返回第 0 年到当前日期的天数。

我想知道是否真的没有办法使用 DIFF,或者在这种意义上是否有任何替代方法。

【问题讨论】:

  • 这没有意义,因为它必须随着当前时间的变化不断更新所有分区。
  • 我明白了,这个问题更多的是在这个意义上,也就是说,是否有办法动态地做到这一点......@Barmar
  • 我不这么认为。它必须至少每天重新分区,如果ReferenceDateDATETIME 而不是DATE,则可能更频繁(因为日期差异取决于当前时间)。

标签: mysql partitioning


【解决方案1】:

PARTITIONed 表是根据PARTITION BY ... 中的说明将某些行永久放入一个“子表”或另一个表中的表。

所以,这绝对是不可能的。为了实现这一点,MySQL 必须将行从一个分区移动到另一个分区,即使您没有接触表

即使有可能,它也可能不会提供任何性能改进。毕竟,你可以有这样的东西:

WHERE ReferenceDate >= NOW() - INTERVAL 180 DAY
  AND ReferenceDate  < NOW() - INTERVAL  90 DAY

那么,如果你也有

  AND CustomerId = 123

那么这个索引将非常适合查找所需的行:

INDEX(CustomerId, ReferenceDate)

那不需要PARTITIONing

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-08-29
    • 2016-07-07
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多