2

次のように、既存のテーブルを変更して、年と週のサブパーティションを追加しようとしています。

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 operationsおよびMySQL RANGE and LIST Partitions。ただし、どちらもテーブルを変更してサブパーティションを作成する方法については説明していません。

私の質問の 2 番目の部分は、このパーティショニング スキームに関するフィードバックです。これに入るデータは、毎分記録されるセンサーの読み取り値であり、最も一般的なクエリ操作は先週のデータに対するものです。「WHERE dtime > date」は非常に一般的であるため、定期的にテーブルからデータをアーカイブテーブルに手動で移動する必要がないため、これによりクエリが大幅に高速化されるはずです。

4

2 に答える 2

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)
);
于 2016-05-23T12:46:59.557 に答える
0

さらに調査した結果、このアプローチにはいくつかの問題があることがわかりました。

  1. DATETIME 値 (例の dtime) でパーティションを範囲指定することはできません。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.html

  2. 私が分割していたテーブルには、自動インクリメント ID 列に主キーがあり、別の主キーがある場合、インデックスで分割することはできません。

    ERROR 1503 ( HY000 ): A PRIMARY KEY must include all columns in the table's partitioning function http://blog.mclaughlinsoftware.com/2011/05/09/mysqls-real-partition-key/ 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

私が今知っていることから、主キーとして UNIQUE AUTO_INCREMENT id がある場合、その値以外でパーティション化することは不可能です。

私のクエリはすべて WHERE 条件で dtime 列を使用しているため、dtime で何らかの方法でパーティション分割できない限り、このテーブルをパーティション分割するメリットはないようです (パフォーマンスの観点から)。

于 2012-09-14T14:43:18.320 に答える