2012-09-14 66 views
2

我试图改变现有的表增加一年,周子分区,就像这样:MySQL的ALTER TABLE与子分区失败

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”非常常见,无需手动将数据定期移出表格到归档表格中。

回答

0

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

  1. 这是不可能的范围分区的DATETIME值(该示例中的dtime)。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.html

  2. 我分区的表在自动增量id列上有一个主键,并且如果存在不同的主键,则不能在索引上进行分区。

    ERROR 1503(HY000):主键必须包括在表的分区函数的所有列 又见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

从我现在知道了,如果你有一个唯一的ID AUTO_INCREMENT作为主键,这是不可能的,只是任何有价值的东西分区。

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

1

如果你想一个分区​​添加到一个已经存在的表,删除主键和创建复合主键:

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) 
);