## モジュール 3: HASHおよびKEYでパーティション分割されたテーブル

+ この演習では、HASHパーティションテーブルとKEYでパーティション分割されたテーブルを作成します。両方のテーブルに同じデータを挿入した後、データの分布を比較します。

### 手順 1. 新しいHASHパーティションテーブル `employees1` を作成する

  ```sql
  CREATE TABLE employees1(
     id INT NOT NULL,
     fname VARCHAR(30),
     lname VARCHAR(30),
     hired DATE NOT NULL DEFAULT '1970-01-01',
     job_code INT
  )
  PARTITION BY HASH(YEAR(hired))
  PARTITIONS 5;
  ```

  ```output
  Query OK, 0 rows affected (0.54 sec)
  ```

### 手順 2. `employees1` にデータを挿入する

  ```sql
  INSERT INTO employees1 VALUES(1, 'Jim', 'Lee', '2023-04-04', 2);
  INSERT INTO employees1 VALUES(2, 'Tim', 'Anderson', '2023-05-10', 2);
  INSERT INTO employees1 VALUES(3, 'Mike', 'Jackson', '2023-05-10', 3);
  INSERT INTO employees1 VALUES(4, 'Benjamin', 'Thompson', '2023-09-24', 1);
  INSERT INTO employees1 VALUES(5, 'Charlotte', 'Clark', '2023-09-24', 1);
  ```

  ```output
  Query OK, 1 row affected (0.00 sec)
  ```

+ 挿入されたすべての行に同じ YEAR(hired) 値があります。データの分布を確認しましょう。

   ```sql
  ANALYZE TABLE employees1;
  SELECT table_name, partition_name, partition_description, table_rows FROM information_schema.partitions WHERE table_schema = 'test' AND table_name='employees1'
  ORDER BY partition_name;
  ```

  ```outputs
  +------------+----------------+-----------------------+------------+
  | table_name | partition_name | partition_description | table_rows |
  +------------+----------------+-----------------------+------------+
  | employees1 | p0             |                       |          0 |
  | employees1 | p1             |                       |          0 |
  | employees1 | p2             |                       |          0 |
  | employees1 | p3             |                       |          5 |
  | employees1 | p4             |                       |          0 |
  +------------+----------------+-----------------------+------------+
  5 rows in set (0.01 sec)
  ```

+ すべての行はパーティション `p3` に格納されています。なぜでしょう？テーブル `employees1` をトランケートして、再度新しい行を挿入してみましょう。

   ```sql
  TRUNCATE TABLE employees1;
  INSERT INTO employees1 VALUES(1, 'Jim', 'Lee', '2020-04-04', 2);
  INSERT INTO employees1 VALUES(2, 'Tim', 'Anderson', '2021-05-10', 2);
  INSERT INTO employees1 VALUES(3, 'Mike', 'Jackson', '2022-05-10', 3);
  INSERT INTO employees1 VALUES(4, 'Benjamin', 'Thompson', '2023-09-24', 1);
  INSERT INTO employees1 VALUES(5, 'Charlotte', 'Clark', '2024-09-24', 1);
  ```

  ```output
  Query OK, 1 row affected (0.01 sec)
  ```

+ 今回、挿入されたすべての行に異なる `YEAR(hired)` 値があります。データの分布を確認しましょう。

   ```sql
  ANALYZE TABLE employees1;
  SELECT table_name, partition_name, partition_description, table_rows FROM information_schema.partitions WHERE table_schema = 'test' AND table_name='employees1'
  ORDER BY partition_name;
  ```

  ```output
  +------------+----------------+-----------------------+------------+
  | table_name | partition_name | partition_description | table_rows |
  +------------+----------------+-----------------------+------------+
  | employees1 | p0             |                       |          1 |
  | employees1 | p1             |                       |          1 |
  | employees1 | p2             |                       |          1 |
  | employees1 | p3             |                       |          1 |
  | employees1 | p4             |                       |          1 |
  +------------+----------------+-----------------------+------------+
  5 rows in set (0.01 sec)
  ```

+ 今回、各パーティションに1行ずつあります。

### 手順 3. 新しいKEYでパーティション分割されたテーブル `employees2` を作成する

  ```sql
  CREATE TABLE employees2(
     id INT NOT NULL,
     fname VARCHAR(30),
     lname VARCHAR(30),
     hired DATE NOT NULL DEFAULT '1970-01-01',
     job_code INT
  )
  PARTITION BY KEY(hired)
  PARTITIONS 5;
  ```

  ```output
  Query OK, 0 rows affected (0.54 sec)
  ```

### 手順 4. `employees2` にデータを挿入する

  ```sql
  INSERT INTO employees2 VALUES(1, 'Jim', 'Lee', '2023-04-04', 2);
  INSERT INTO employees2 VALUES(2, 'Tim', 'Anderson', '2023-05-10', 2);
  INSERT INTO employees2 VALUES(3, 'Mike', 'Jackson', '2023-05-10', 3);
  INSERT INTO employees2 VALUES(4, 'Benjamin', 'Thompson', '2023-09-24', 1);
  INSERT INTO employees2 VALUES(5, 'Charlotte', 'Clark', '2023-09-24', 1);
  ```

  ```output
  Query OK, 1 row affected (0.00 sec)
  ```

+ `employees2` に挿入されたすべての行には異なる `hired` 値がありますが、`YEAR(hired)` の値は同じです。データの分布を確認してみましょう。

   ```sql
  ANALYZE TABLE employees2;
  SELECT table_name, partition_name, partition_description, table_rows FROM information_schema.partitions WHERE table_schema = 'test' AND table_name='employees2'
  ORDER BY partition_name;
  ```

  ```output
  +------------+----------------+-----------------------+------------+
  | table_name | partition_name | partition_description | table_rows |
  +------------+----------------+-----------------------+------------+
  | employees2 | p0             |                       |          2 |
  | employees2 | p1             |                       |          2 |
  | employees2 | p2             |                       |          0 |
  | employees2 | p3             |                       |          1 |
  | employees2 | p4             |                       |          0 |
  +------------+----------------+-----------------------+------------+
  5 rows in set (0.02 sec)
  ```

+ 行は、`YEAR(hired)` の値が同じにもかかわらず、3つのパーティションに分散されています。テーブル `employees2` をトランケートして、5つの新しい行を再度挿入してみましょう。

   ```sql
  TRUNCATE TABLE employees2;
  INSERT INTO employees2 VALUES(1, 'Jim', 'Lee', '2021-05-10', 2);
  INSERT INTO employees2 VALUES(2, 'Tim', 'Anderson', '2021-05-10', 2);
  INSERT INTO employees2 VALUES(3, 'Mike', 'Jackson', '2021-05-10', 3);
  INSERT INTO employees2 VALUES(4, 'Benjamin', 'Thompson', '2021-05-10', 1);
  INSERT INTO employees2 VALUES(5, 'Charlotte', 'Clark', '2021-05-10', 1);
  ```

  ```output
  Query OK, 1 row affected (0.00 sec)
  ```

+ `employees2` に挿入されたすべての行には同じ `hired` 値があります。データの分布を確認しましょう。

   ```sql
  ANALYZE TABLE employees2;
  SELECT table_name, partition_name, partition_description, table_rows FROM information_schema.partitions WHERE table_schema = 'test' AND table_name='employees2'
  ORDER BY partition_name;
  ```

  ```output
  +------------+----------------+-----------------------+------------+
  | table_name | partition_name | partition_description | table_rows |
  +------------+----------------+-----------------------+------------+
  | employees2 | p0             |                       |          0 |
  | employees2 | p1             |                       |          0 |
  | employees2 | p2             |                       |          0 |
  | employees2 | p3             |                       |          0 |
  | employees2 | p4             |                       |          5 |
  +------------+----------------+-----------------------+------------+
  5 rows in set (0.01 sec)
  ```

+ すべての行がパーティション `p4` に格納されています。なぜでしょう？テーブル `employees2` をトランケートして、5つの新しい行を再度挿入してみましょう。

   ```sql
  TRUNCATE TABLE employees2;
  INSERT INTO employees2 VALUES(1, 'Jim', 'Lee', '2020-04-04', 2);
  INSERT INTO employees2 VALUES(2, 'Tim', 'Anderson', '2021-05-10', 2);
  INSERT INTO employees2 VALUES(3, 'Mike', 'Jackson', '2022-05-10', 3);
  INSERT INTO employees2 VALUES(4, 'Benjamin', 'Thompson', '2023-09-24', 1);
  INSERT INTO employees2 VALUES(5, 'Charlotte', 'Clark', '2024-09-24', 1);
  ```

  ```output
  Query OK, 1 row affected (0.00 sec)
  ```

+ `employees2` に挿入されたすべての行には異なる `hired` 値があります。データの分布を確認しましょう。

   ```sql
  ANALYZE TABLE employees2;
  SELECT table_name, partition_name, partition_description, table_rows FROM information_schema.partitions WHERE table_schema = 'test' AND table_name='employees2' ORDER BY partition_name;
  ```

  ```output
  +------------+----------------+-----------------------+------------+
  | table_name | partition_name | partition_description | table_rows |
  +------------+----------------+-----------------------+------------+
  | employees2 | p0             |                       |          1 |
  | employees2 | p1             |                       |          2 |
  | employees2 | p2             |                       |          1 |
  | employees2 | p3             |                       |          0 |
  | employees2 | p4             |                       |          1 |
  +------------+----------------+-----------------------+------------+
  5 rows in set (0.01 sec)
  ```

### 手順 5. テーブルをクリーンアップする

  ```sql
  DROP TABLE employees1;
  DROP TABLE employees2;
  ```

  ```output
  Query OK, 0 rows affected (0.53 sec)
  ```
