带有子分区的MySQL ALTER TABLE失败

时间:2012-09-14 13:43:03

标签: mysql partitioning database-partitioning

我正在尝试更改现有表格以添加年份和星期子分区,如下所示:

CREATE TABLE test_table(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    dtime DATETIME NOT NULL);

ALTER TABLE test_table
PARTITION BY RANGE ( YEAR(dtime) )
SUBPARTITION BY RANGE( WEEK(dtime) ) ( 
    PARTITION y0 VALUES LESS THAN (2013) (
        SUBPARTITION w0 VALUES LESS THAN (2),
        ...
        SUBPARTITION w52 VALUES LESS THAN (54)
    ),
    PARTITION y1 VALUES LESS THAN (2014) (
        SUBPARTITION w0 VALUES LESS THAN (2),
        ...
        SUBPARTITION w52 VALUES LESS THAN (54)
    ),
    PARTITION y2 VALUES LESS THAN (2015) (
        SUBPARTITION w0 VALUES LESS THAN (2),
        ...
        SUBPARTITION w52 VALUES LESS THAN (54)
    ),
    PARTITION y3 VALUES LESS THAN (2016) (
        SUBPARTITION w0 VALUES LESS THAN (2),
        ...
        SUBPARTITION w52 VALUES LESS THAN (54)
    )
);

然而,这给了我一个模糊而无益的回应:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that     corresponds to your MySQL server version for the right syntax to use near 'RANGE(     WEEK(DTIME) ) (
            PARTITION y0 VALUES LESS THAN (2013) (
                    SUBPARTITION ' at line 3

我查看了文档:MySQL ALTER TABLE Partition operationsMySQL RANGE and LIST Partitions。但是,这些都没有描述如何更改表以创建子分区。

我的问题的第二部分是关于此分区方案的反馈。将进入此的数据是每分钟记录的传感器读数,最常见的查询操作是上周的数据。我认为这应该会大大加快我的查询速度,因为“WHERE dtime> date”非常常见,无需手动将数据从表中定期移出到存档表中。

2 个答案:

答案 0 :(得分:1)

如果要将分区BY LIST添加到现有表中,请删除主键并创建复合主键:

alter table test_table drop primary key, add primary key (id,<some other key>);
alter table orders partition by list(<some other key>) (
    partition p0 values IN (1),
    partition p1 values IN (2),
    partition p2 values IN (3),
    partition p3 values IN (4),
    partition p4 values IN (5),
    partition p5 values IN (6),
    partition p6 values IN (7),
    partition p7 values IN (8),
    partition p8 values IN (9),
    partition p9 values IN (10)
);

答案 1 :(得分:0)

经过进一步调查,我发现了这种方法存在的一些问题。

  1. 无法对DATETIME值(示例中的dtime)进行分区。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.html

  2. 我正在分区的表在自动增量id列上有一个主键,如果有不同的主键,则无法对索引进行分区。

    ERROR 1503(HY000):PRIMARY KEY必须包含表格分区功能中的所有列 另见http://blog.mclaughlinsoftware.com/2011/05/09/mysqls-real-partition-key/ http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

  3. 不允许WEEK()作为分区功能。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.html

  4. 根据我现在所知,如果你有一个UNIQUE AUTO_INCREMENT id作为主键,除了那个值之外的任何东西都不可能进行分区。

    我的查询都在WHERE条件中使用dtime列,所以看起来除非我能在dtime上以某种方式进行分区,否则对此表进行分区没有任何好处(从性能角度来看)。