MySQLパーティション--リストパーティション

3192 ワード

MySQLパーティション–リストパーティション
MySQLのリストパーティションは、範囲パーティションと多くの点で似ていますが、この2つのパーティションタイプの主な違いは、範囲パーティションに表示される定義が連続して終端しない範囲パーティションを定義する必要があり、リストパーティションは、各パーティションにリストを定義し、行で指定された列の値がパーティション定義のリストに存在するかどうかによって、その行がどのパーティションに属しているかを判断することです.リストパーティションはPARTITION BY LIST(expr)で実現され、exprはテーブル内のカラム名の後者の式(この式はカラムベースで、戻り値はint型でなければならない)、VALUES IN (value_list)でパーティションを定義し、value_listは","で区切られたint値のリストである.次の表があるとします.
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
);

テーブルに20個のデータがあると仮定し、これらのデータを4つのグループに分けたいと思います.
Region
Store ID Numbers
North
3, 5, 6, 9, 17
East
1, 2, 10, 11, 19, 20
West
4, 12, 13, 14, 18
Central
7, 8, 15, 16
次の文を使用して、テーブル内のデータを領域別にパーティション化します.
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id)(
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION PCENTRAL VALUES IN (7,8,15,16)
);

これにより、指定した領域の従業員レコードを簡単に追加、削除できます.例えば、West区のすべての店を別の会社に売っています.このエリアのすべての店の従業員は、ALTER TABLE employees TRUNCATE PARTITION pWestで指定されたエリアのすべての店の従業員を削除することができます.このsqlの効率はDELETE FROM employees WHERE store_id in (4,12,13,14,18)よりずっと高いです.ALTER TABLE employees DROP PARTITION pWest pWestエリアのすべての従業員を削除することもできますが、pWestパーティションを削除することもできます.ALTER TABLE employees ADD PARTITIONを使用して、パーティションを追加することもできます.
範囲パーティションの場合とは異なり、リストパーティションにはMAXVALUEのような集計はありません.表示する値はすべて式PARTITION ... VALUES IN (...)に表示されなければなりません.データを挿入すると、パーティション列の値が上書きされないとエラーが表示されます.
mysql> CREATE TABLE h2 (
    ->   c1 INT,
    ->   c2 INT
    -> )
    -> PARTITION BY LIST(c1) (
    ->   PARTITION p0 VALUES IN (1, 4, 7),
    ->   PARTITION p1 VALUES IN (2, 5, 8)
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO h2 VALUES (3, 5);
ERROR 1525 (HY000): Table has no partition for value 3

1つのsqlで複数のローを挿入すると、挿入された動作は、トランザクションをサポートするエンジンが使用されているかどうかに依存します.InnoDBを例にとると、このsqlは単一のトランザクションとみなされ、1行のデータが上書きされていない場合、すべての行は挿入されません.MyISAMを使用すると、上書きしない前の行が挿入され、その後の行は挿入されません.IGNOREキーワードを使用してエラーを無視することができます.上書きされたすべての行が挿入され、上書きされていない行は挿入されません.
mysql> TRUNCATE h2;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM h2;
Empty set (0.00 sec)

mysql> INSERT IGNORE INTO h2 VALUES (2, 5), (6, 10), (7, 5), (3, 1), (1, 9);
Query OK, 3 rows affected (0.00 sec)
Records: 5  Duplicates: 2  Warnings: 0

mysql> SELECT * FROM h2;
+------+------+
| c1   | c2   |
+------+------+
|    7 |    5 |
|    1 |    9 |
|    2 |    5 |
+------+------+
3 rows in set (0.00 sec)