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';
1. データを挿入します
insert into tblist(id,store_id) values(1,1),(7,7);
2つのパーティションaとbにそれぞれレコードを挿入します
2. リストにない値を挿入します
リストにないパーティションへのレコードの挿入 列挙リストにない場合、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 のみです
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));
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. その他のパーティション
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';
LIST パーティションは、非整形時間型フィールドの変換パーティション化もサポートしています。
4. テーブルパーティションを削除します
ALTER TABLE tablename REMOVE PARTITIONING ;
注: パーティションを削除する場合は、remove を使用すると、パーティションの定義が削除されるだけで、データは一緒に削除されます
とは異なります。