東京リージョンにやってきた MySQL HeatWave on AWS を試す (3) バックアップをリストアしてサイズを変えてみる編

こちらの記事の続きです。

- **[東京リージョンにやってきた MySQL HeatWave on AWS を試す (2) サンプルクエリ実行編](https://qiita.com/hmatsu47/items/0979f877ad596cf3cf67)**

https://qiita.com/hmatsu47/items/0979f877ad596cf3cf67

現状、MySQL HeatWave on AWS のシェイプサイズや HeatWave Cluster 構成を変えるには、(1) に記したとおりバックアップからのリストアかダンプデータのインポートが必要です。

今回、実際にバックアップからのリストアにあわせてシェイプサイズや HeatWave Cluster 構成を変更し、(2) と同じクエリの所要時間を比較してみました。

:::note warn
2023/7/25 時点の情報です。
今後、画面構成や手順、結果などが変わる可能性があります。
:::

:::note
**2023/9/9 追記：**
2023/8/8 のリリースで MySQL DB のストレージサイズをオンライン拡張できるようになりました。
https://dev.mysql.com/doc/heatwave-aws/en/heatwave-aws-increase-dbsystem-storage.html#GUID-F2BF290C-1F9C-4B66-A730-44F7B46FDCC0
:::

## バックアップをリストアする

マネージドサービスですので手順は簡単です。

### 一覧から対象バックアップを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/423c357c-a299-30fe-8b33-014615f70a20.png)
**「State」** が Active なバックアップを選択して **「Restore Backup」** をクリックします。

### リストア先の MySQL DB を設定

画面右側に設定項目が表示されるので入力・選択していきます。

新規の MySQL DB を作成する場合と同じです。

:::note
既存の MySQL DB・HeatWave Cluster とは別に作成されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/a8228d52-f497-12ac-81f5-2974e032864d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/687cae57-88b2-f8a3-d771-443c3ca272c9.png)
**「Next」** で進みます。

### HeatWave Cluster を設定

こちらも新規作成と同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/e952fd0b-654e-739e-015c-7843b2e93029.png)
**「Restore」** でリストア開始です。

しばらく待って **「State」** と **「HeatWave State」** が Active になったら作成完了です。

:::note
私のアカウントの初期状態では、HeatWave.16GB のノードは合計 8 個までに制限されていました。
これ以上増やす場合は申請が必要なようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/b29fafc1-19dd-6c31-44a6-bcf6a69a9d1b.png)
:::

## リストアしたデータでクエリを実行する

### HeatWave 無効状態で実行

まずは`SET SESSION use_secondary_engine=OFF;`で HeatWave を無効にして試します。

```sh
mysql> USE tpch;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SET SESSION use_secondary_engine=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql>  SELECT
    ->      l_returnflag,
    ->      l_linestatus,
    ->      SUM(l_quantity) AS sum_qty,
    ->      SUM(l_extendedprice) AS sum_base_price,
    ->      SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
    ->      SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
    ->      AVG(l_quantity) AS avg_qty,
    ->      AVG(l_extendedprice) AS avg_price,
    ->      AVG(l_discount) AS avg_disc,
    ->      COUNT(*) AS count_order
    ->  FROM
    ->      lineitem
    ->  WHERE
    ->      l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
    ->  GROUP BY l_returnflag , l_linestatus
    ->  ORDER BY l_returnflag , l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty     | sum_base_price  | sum_disc_price    | sum_charge          | avg_qty   | avg_price    | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A            | F            | 37734107.00 |  56586554400.73 |  53758257134.8700 |  55909065222.827692 | 25.522006 | 38273.129735 | 0.049985 |     1478493 |
| N            | F            |   991417.00 |   1487504710.38 |   1413082168.0541 |   1469649223.194375 | 25.516472 | 38284.467761 | 0.050093 |       38854 |
| N            | O            | 74476040.00 | 111701729697.74 | 106118230307.6056 | 110367043872.497010 | 25.502227 | 38249.117989 | 0.049997 |     2920374 |
| R            | F            | 37719753.00 |  56568041380.90 |  53741292684.6040 |  55889619119.831932 | 25.505794 | 38250.854626 | 0.050009 |     1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (14.91 sec)
```

リストア後 1 回目はバッファプールに載っていない状態なので結果を無視し、その後の 5 回中最大値・最小値を除く 3 回分を平均して結果を出してみます（結果は後ほどまとめて記載）。

### HeatWave 有効状態で実行

続いて`SET SESSION use_secondary_engine=ON;`で HeatWave を有効にして試します。

```sh
mysql> SET SESSION use_secondary_engine=ON;
Query OK, 0 rows affected (0.00 sec)

mysql>  SELECT
    ->      l_returnflag,
    ->      l_linestatus,
    ->      SUM(l_quantity) AS sum_qty,
    ->      SUM(l_extendedprice) AS sum_base_price,
    ->      SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
    ->      SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
    ->      AVG(l_quantity) AS avg_qty,
    ->      AVG(l_extendedprice) AS avg_price,
    ->      AVG(l_discount) AS avg_disc,
    ->      COUNT(*) AS count_order
    ->  FROM
    ->      lineitem
    ->  WHERE
    ->      l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
    ->  GROUP BY l_returnflag , l_linestatus
    ->  ORDER BY l_returnflag , l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty     | sum_base_price  | sum_disc_price    | sum_charge          | avg_qty   | avg_price    | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A            | F            | 37734107.00 |  56586554400.73 |  53758257134.8700 |  55909065222.827692 | 25.522006 | 38273.129735 | 0.049985 |     1478493 |
| N            | F            |   991417.00 |   1487504710.38 |   1413082168.0541 |   1469649223.194375 | 25.516472 | 38284.467761 | 0.050093 |       38854 |
| N            | O            | 74476040.00 | 111701729697.74 | 106118230307.6056 | 110367043872.497010 | 25.502227 | 38249.117989 | 0.049997 |     2920374 |
| R            | F            | 37719753.00 |  56568041380.90 |  53741292684.6040 |  55889619119.831932 | 25.505794 | 38250.854626 | 0.050009 |     1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (12.74 sec)
```

あれ？速くなりませんね？

念のため、テーブルにセカンダリエンジンを指定してみます。

```sh
mysql>  ALTER TABLE tpch.customer SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.lineitem SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.nation SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.orders SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.part SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.partsupp SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.region SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql>  ALTER TABLE tpch.supplier SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
```

全てのテーブルで実行するまでもありませんでしたが、こちらは「すでに指定されている」状態でした。

HeatWave へのデータロードは…？

```sh
mysql>  ALTER TABLE tpch.customer SECONDARY_LOAD;
Query OK, 0 rows affected (2.02 sec)

mysql>  ALTER TABLE tpch.lineitem SECONDARY_LOAD;
Query OK, 0 rows affected (38.47 sec)

mysql>  ALTER TABLE tpch.nation SECONDARY_LOAD;
Query OK, 0 rows affected (0.50 sec)

mysql>  ALTER TABLE tpch.orders SECONDARY_LOAD;
Query OK, 0 rows affected (10.44 sec)

mysql>  ALTER TABLE tpch.part SECONDARY_LOAD;
Query OK, 0 rows affected (2.19 sec)

mysql>  ALTER TABLE tpch.partsupp SECONDARY_LOAD;
Query OK, 0 rows affected (6.93 sec)

mysql>  ALTER TABLE tpch.region SECONDARY_LOAD;
Query OK, 0 rows affected (0.99 sec)

mysql>  ALTER TABLE tpch.supplier SECONDARY_LOAD;
Query OK, 0 rows affected (0.44 sec)
```

**バックアップからのリストアの場合、HeatWave へのデータロードを明示的に実行しないといけない** ようですね。

## 実行結果

いくつかシェイプサイズや HeatWave Cluster 構成を変えて試してみました。

| MySQL DB シェイプ | HeatWave Cluster 構成 | MySQL（秒） | HeatWave（秒） | MySQL / HeatWave（倍） |
|:-:|:-:|-:|-:|-:|
| 2vCPU・Mem16GB・Disk32GB | 16GBx1 | 13.07 | 0.75 | 17.4 |
| 4vCPU・Mem32GB・Disk64GB | 16GBx2 | 12.75 | 0.42 | 30.4 |
| 8vCPU・Mem64GB・Disk128GB | 16GBx4 | 12.66 | 0.25 | 50.6 |
| 32vCPU・Mem256GB・Disk512GB | 256GBx1 | 12.64 | 0.08 | 158.0 |

MySQL DB のみでの処理時間はシェイプサイズに関わらずほぼ同じですが、これは MySQL では（テーブル全行の`SELECT COUNT(*)`など一部の例外を除き）パラレルクエリに対応していないからでしょうね。

それに対して、 **HeatWave Cluster 構成については、全ノードの合計メモリ容量（と vCPU 数）を増やせば増やすほど高速化** しました。

サンプルデータそのものは 1GB に満たない容量ですが、それでも合計メモリ容量増加の効果が出るのがポイントです。

---

**2023/7/29 追記：**

続きを書きました。

- **[東京リージョンにやってきた MySQL HeatWave on AWS を試す (4) サンプルデータを使って他のクエリを流してみる編](https://qiita.com/hmatsu47/items/230d345e481701a5d735)**

https://qiita.com/hmatsu47/items/230d345e481701a5d735