2016-06-29 64 views
0

我在表格中创建了分区和子分区。我的分区是象下面这样:如何在Mysql中删除特定分区中的子分区?

PARTITION BY RANGE (MONTH(record_date)) 
SUBPARTITION BY HASH (DAY(record_date)) 
(
PARTITION p2012 VALUES LESS THAN (5) 
(
    SUBPARTITION 01_04 ENGINE = InnoDB, 
    SUBPARTITION 02_04 ENGINE = InnoDB, 
    SUBPARTITION 03_04 ENGINE = InnoDB, 
    SUBPARTITION 04_04 ENGINE = InnoDB, 
    SUBPARTITION 05_04 ENGINE = InnoDB, 
    SUBPARTITION 06_04 ENGINE = InnoDB, 
    SUBPARTITION 07_04 ENGINE = InnoDB, 
    SUBPARTITION 08_04 ENGINE = InnoDB, 
    SUBPARTITION 09_04 ENGINE = InnoDB, 
    SUBPARTITION 10_04 ENGINE = InnoDB, 
    SUBPARTITION 11_04 ENGINE = InnoDB, 
    SUBPARTITION 12_04 ENGINE = InnoDB, 
    SUBPARTITION 13_04 ENGINE = InnoDB, 
    SUBPARTITION 14_04 ENGINE = InnoDB, 
    SUBPARTITION 15_04 ENGINE = InnoDB, 
    SUBPARTITION 16_04 ENGINE = InnoDB, 
    SUBPARTITION 17_04 ENGINE = InnoDB, 
    SUBPARTITION 18_04 ENGINE = InnoDB, 
    SUBPARTITION 19_04 ENGINE = InnoDB, 
    SUBPARTITION 20_04 ENGINE = InnoDB, 
    SUBPARTITION 21_04 ENGINE = InnoDB, 
    SUBPARTITION 22_04 ENGINE = InnoDB, 
    SUBPARTITION 23_04 ENGINE = InnoDB, 
    SUBPARTITION 24_04 ENGINE = InnoDB, 
    SUBPARTITION 25_04 ENGINE = InnoDB, 
    SUBPARTITION 26_04 ENGINE = InnoDB, 
    SUBPARTITION 27_04 ENGINE = InnoDB, 
    SUBPARTITION 28_04 ENGINE = InnoDB, 
    SUBPARTITION 29_04 ENGINE = InnoDB, 
    SUBPARTITION 30_04 ENGINE = InnoDB, 
    SUBPARTITION 31_04 ENGINE = InnoDB 
), 
    PARTITION p2013 VALUES LESS THAN (6) 
    (
    SUBPARTITION 01_05 ENGINE = InnoDB, 
    SUBPARTITION 02_05 ENGINE = InnoDB, 
    SUBPARTITION 03_05 ENGINE = InnoDB, 
    SUBPARTITION 04_05 ENGINE = InnoDB, 
    SUBPARTITION 05_05 ENGINE = InnoDB, 
    SUBPARTITION 06_05 ENGINE = InnoDB, 
    SUBPARTITION 07_05 ENGINE = InnoDB, 
    SUBPARTITION 08_05 ENGINE = InnoDB, 
    SUBPARTITION 09_05 ENGINE = InnoDB, 
    SUBPARTITION 10_05 ENGINE = InnoDB, 
    SUBPARTITION 11_05 ENGINE = InnoDB, 
    SUBPARTITION 12_05 ENGINE = InnoDB, 
    SUBPARTITION 13_05 ENGINE = InnoDB, 
    SUBPARTITION 14_05 ENGINE = InnoDB, 
    SUBPARTITION 15_05 ENGINE = InnoDB, 
    SUBPARTITION 16_05 ENGINE = InnoDB, 
    SUBPARTITION 17_05 ENGINE = InnoDB, 
    SUBPARTITION 18_05 ENGINE = InnoDB, 
    SUBPARTITION 19_05 ENGINE = InnoDB, 
    SUBPARTITION 20_05 ENGINE = InnoDB, 
    SUBPARTITION 21_05 ENGINE = InnoDB, 
    SUBPARTITION 22_05 ENGINE = InnoDB, 
    SUBPARTITION 23_05 ENGINE = InnoDB, 
    SUBPARTITION 24_05 ENGINE = InnoDB, 
    SUBPARTITION 25_05 ENGINE = InnoDB, 
    SUBPARTITION 26_05 ENGINE = InnoDB, 
    SUBPARTITION 27_05 ENGINE = InnoDB, 
    SUBPARTITION 28_05 ENGINE = InnoDB, 
    SUBPARTITION 29_05 ENGINE = InnoDB, 
    SUBPARTITION 30_05 ENGINE = InnoDB, 
    SUBPARTITION 31_05 ENGINE = InnoDB 
) 

现在,我想用下面的变更查询,删除一些分区:

alter table my_records drop partition 30_04; 

它给了我以下错误:

错误1507(HY000):错误列表中的分区删除

删除子分区的语法是什么。我不想使用重组语法。

回答

1

与其解决您的具体问题,让我指出您的分区+子分区设计可能无用。

  • BY RANGE (MONTH(...))不提供任何性能。此外,如果你有一个日期范围,它可能会选择所有分区。
  • BY HASH (...)不提供任何性能。再一次,一个范围会选择所有的子分区。

请解释一下你是试试来实现。您可能有一些我尚未发现的划分新功能。

考虑一个简单的PARTITION BY RANGE (TO_DAYS(...))SUBPARTITIONs。它的主要优势在于DROPping最老的分区(相对于缓慢的DELETE)。它确实为而不是为正常的SELECTs提供了加速。

More discussion