我有一个包含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个子分区(我尝试直接删除数据,但由于表太大,需要花费大量时间删除它们)。我应该用什么来删除这些子分区?
答案 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
,如果删除整整一个月需要很长时间,可能每天删除一行(通过脚本)。