如何在mysql中删除子分区

时间:2016-08-10 15:08:10

标签: mysql

我有一个包含createddate的表,我在createddate上创建了一个子分区,如下所示:

    ALTER TABLE tablename
     PARTITION BY RANGE( YEAR(CreatedDate) )
        SUBPARTITION BY HASH(MONTH(CreatedDate) ) (

PARTITION p2015 VALUES LESS THAN (2016) (
            SUBPARTITION dec_2015,
            SUBPARTITION jan_2015,
            SUBPARTITION feb_2015,
            SUBPARTITION mar_2015,
            SUBPARTITION apr_2015,
            SUBPARTITION may_2015,
            SUBPARTITION jun_2015,
            SUBPARTITION jul_2015,
            SUBPARTITION aug_2015,
            SUBPARTITION sep_2015,
            SUBPARTITION oct_2015,
            SUBPARTITION nov_2015

现在我想要删除createddate少于2015年6月的所有数据,这意味着删除5个子分区(我尝试直接删除数据,但由于表太大,需要花费大量时间删除它们)。我应该用什么来删除这些子分区?

1 个答案:

答案 0 :(得分:0)

HASH()无法删除分区(因为分区的分配会随着总分区数的变化而变化),请参阅ALTER TABLE Partition Operations

  

DROP PARTITION可用于删除一个或多个RANGE或LIST分区。此语句不能与HASH或KEY分区一起使用

相反,您可以使用truncate一次删除特定分区中的所有数据:

alter table tablename truncate partition jan_2015, feb_2015,
               mar_2015, apr_2015, may_2015; 

Truncate将基本上删除并重新创建您的分区,从而以毫秒为单位删除其内容。

如果您有2014年的值,则尽管您的分区名称也是按月分配的,但它们的值也是如此。 2014年12月将保留(在dec_2015分区)。

不幸的是,对于子分区truncate在5.7.2之前不起作用:

  

在MySQL 5.7.2之前,TRUNCATE PARTITION不适用于子分区(Bug#14028340,Bug#65184)。

在这种情况下,你必须先更新mysql - 或者坚持使用delete,如果删除整整一个月需要很长时间,可能每天删除一行(通过脚本)。