MySQL LIST パーティション

高洛峰
リリース: 2016-11-05 10:52:23
オリジナル
1569 人が閲覧しました

LIST パーティションと RANGE パーティションは非常に似ています。主な違いは、LIST が列挙値リストのコレクションであるのに対し、RANGE は連続間隔値のコレクションであることです。この 2 つは構文が非常に似ています。また、LIST パーティション列を null 以外の列にすることをお勧めします。それ以外の場合、列挙リストに null 値が存在しない場合、null 値の挿入は失敗します。これは、RANGE パーティションでは、null 値がヌル値として格納されます。メインの LIST パーティションは整数フィールドのみをサポートしており、バージョン 5.5 以降では、LIST COLUMN を使用して整数フィールドに変換する必要があります。関数変換を行わずに非整数フィールドをサポートするためのパーティション。COLUMN パーティションに詳細な説明があります。

1. パーティションを作成します

List 内の各パーティションの列挙値は異なるだけでよく、固定された順序はありません。

CREATE TABLE tblist (
    id INT NOT NULL,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION a VALUES IN (1,5,6),
    PARTITION b VALUES IN (2,7,8),
    PARTITION c VALUES IN (3,9,10),
    PARTITION d VALUES IN (4,11,12)
);
ログイン後にコピー
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblist';
ログイン後にコピー

MySQL LIST パーティション

1. データを挿入します

insert into tblist(id,store_id) values(1,1),(7,7);
ログイン後にコピー

2つのパーティションaとbにそれぞれレコードを挿入します

MySQL LIST パーティション

2. リストにない値を挿入します

MySQL LIST パーティション

リストにないパーティションへのレコードの挿入 列挙リストにない場合、null 値の挿入も失敗します。 2. パーティション管理

1. を追加します。パーティション

ALTER TABLE tblist ADD PARTITION (PARTITION e VALUES IN (20));
ログイン後にコピー

注: 既存のパーティションを追加することはできません。

2. パーティションを結合する

ALTER TABLE tblist REORGANIZE PARTITION  a,b INTO (PARTITION m VALUES IN (1,5,6,2,7,8));
ログイン後にコピー

パーティション a と b をパーティション m に結合します

注: RANGE パーティションと同様、複数の隣接するパーティションのみを結合でき、パーティション間を結合することはできません。たとえば、2 つのパーティション a と c をマージすることはできません。マージできるのは a、b、c のみです

MySQL LIST パーティション3. パーティションを分割します

ALTER TABLE tblist REORGANIZE PARTITION  a,b,c INTO 
(PARTITION n VALUES IN (1,5,6,3,9,10),
PARTITION m VALUES IN (2,7,8));

ALTER TABLE tblist REORGANIZE PARTITION  n INTO 
    ( PARTITION a VALUES IN (1,5,6),
    PARTITION b VALUES IN (3,9,10));
ログイン後にコピー

MySQL LIST パーティション 2 回の分割の後、リストは列挙されます (3, 9, 10) 実際には (2,7,8) より前にランク付けされます。最初は、n の列挙値が m より小さいため、abc は 2 つのパーティションにマージされます。 n パーティションは m パーティションの前にあるため、分割されたパーティションも m パーティションの前にランク付けされます。a パーティションの値が b パーティションの値よりも小さいため、a がランク付けされます。 bの前で。

注: 1. バージョン 5.7.12 でのテストでは、元の列挙値にデータが含まれており、新しくマージまたは分割されたパーティション列挙値にデータが含まれている場合、パーティションのマージと分割によって再定義された列挙値が元の値ではない可能性があることがわかりました。元の列挙値が含まれていない場合、データは失われます。なぜ mysql がこの動作を禁止していないのかはわかりませんが、データが確実に保持されるように、パーティションの列挙値がマージでも分割でも変更されないこと、または増加のみが可能で減少はできないことが人為的に要求されています。失われていません。

2. マージおよび分割されたパーティションは隣接するパーティションであるため、新しいパーティションは元のパーティションの値に従ってマージおよび分割され、新しいパーティションも元のパーティションの順序位置になります。

4. パーティションの削除

ALTER TABLE tblist DROP PARTITION e;
ログイン後にコピー

注: パーティションを削除すると、そのパーティション内のデータも削除され、この値のデータを後でテーブルに挿入することはできません。 。

3. その他のパーティション

    時間フィールドのパーティション化
  1. CREATE TABLE listdate (
        id INT NOT NULL,
        hired DATETIME NOT NULL
    )
    PARTITION BY LIST( YEAR(hired) ) 
    (
        PARTITION a VALUES IN (1990),
        PARTITION b VALUES IN (1991),
        PARTITION c VALUES IN (1992),
        PARTITION d VALUES IN (1993)
    );
    
    ALTER TABLE listdate ADD INDEX ix_hired(hired);
    
    INSERT INTO listdate() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(1,'1992-01-01 10:00:00');
    ログイン後にコピー
    EXPLAIN SELECT * FROM listdate WHERE hired='1990-01-01 10:00:00';
    ログイン後にコピー

MySQL LIST パーティションLIST パーティションは、非整形時間型フィールドの変換パーティション化もサポートしています。

4. テーブルパーティションを削除します

ALTER TABLE tablename
REMOVE PARTITIONING ;
ログイン後にコピー

注: パーティションを削除する場合は、remove を使用すると、パーティションの定義が削除されるだけで、データは一緒に削除されます

とは異なります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート