分区和子分区

时间:2012-01-14 08:52:09

标签: mysql

分区表的以下CREATE TABLE语句按预期工作,没有错误。

CREATE TABLE `ox_data_archive_20120108` (
    `id` bigint(20) unsigned NOT NULL,
    `creativeid` int unsigned NOT NULL,
    `zoneid` int unsigned NOT NULL,
    `datetime` datetime NOT NULL
) PARTITION BY LIST(to_days(datetime )) (
      PARTITION `1Jan10` VALUES IN (to_days('2010-01-01') ),
      PARTITION `2Jan10` VALUES IN (to_days('2010-01-02') ),
      PARTITION `3Jan10` VALUES IN (to_days('2010-01-03') )
  );

我需要做的是根据date + zoneid创建子分区。我尝试了以下方法:

CREATE TABLE mypart (
    `id` bigint(20) unsigned NOT NULL,
    `creativeid` int unsigned NOT NULL,
    `zoneid` int unsigned NOT NULL,
    `datetime` datetime NOT NULL
) PARTITION BY LIST(to_days(datetime )) 
  SUBPARTITION BY KEY(zoneid) (
      PARTITION `1Jan10` VALUES IN (to_days('2010-01-01') )
        (Subpartition s1, Subpartition s2),
      PARTITION `2Jan10` VALUES IN (to_days('2010-01-02') ) 
        (Subpartition s3, Subpartition s4),
      PARTITION `3Jan10` VALUES IN (to_days('2010-01-03') )
        (Subpartition s5, Subpartition s6)
  );

插入此表:

INSERT INTO mypart VALUES (1, 2, 3, '2012-01-31 04:10:03');

导致以下错误:

  

错误1526(HY000):表没有值734898的分区

我的查询期望根据日期使用zoneid子分区。有可能吗?

1 个答案:

答案 0 :(得分:4)

与您断言第一个表无误地运行相反,将示例数据插入其中:

INSERT INTO `ox_data_archive_20120108` VALUES (1, 2, 3, '2012-01-31 04:10:03');

导致与第二个表相同的错误。错误(734898)中给出的值恰好是to_days('2012-01-31')的值。您收到此错误的原因是您只有1月1日 st 到3 rd ,2010的分区。样本数据的日期和年份都在定义的分区。您可能需要DAYOFMONTH,而不是TO_DAYS(返回从第0年到指定日期的天数)。由于每个分区都是连续的,因此RANGE分区似乎比LIST更合适。

关闭主题,当您要为子分区设置选项时,只需指定单独的子分区定义。由于您没有这样做,SUBPARTITIONS 2子句将与您的语句做同样的事情,但更简单。

CREATE TABLE mypart (
    `id` bigint(20) unsigned NOT NULL,
    `creativeid` int unsigned NOT NULL,
    `zoneid` int unsigned NOT NULL,
    `datetime` datetime NOT NULL
) PARTITION BY RANGE(DAYOFMONTH(`datetime`)) 
  SUBPARTITION BY KEY(zoneid) 
  SUBPARTITIONS 2 (
      PARTITION `01` VALUES LESS THAN 2, -- Note: 0 is valid day-of-month
      PARTITION `02` VALUES LESS THAN 3,
      PARTITION `03` VALUES LESS THAN 4,
      ...
  );