こんにちは。s.tanakaです。
前回の投稿に続きOracle Cloud MDS(MySQL Database Service)ネタとなります。
今回はデータ分析処理を高速化できるMDS専用のHeatWave機能を検証してみたので、構築から動作確認までご紹介しようと思います!
Oracle公式のチュートリアルサイトにより詳細に構築方法が詳細に載っています。
■HeatWave構築チュートリアル
https://oracle-japan.github.io/ocitutorials/beginners/creating-HeatWave/
MDSの作成
本投稿では接続用仮想インスタンス、VCNおよびSQL接続のためのポリシー設定は全て設定完了している想定とします。
それでは早速構築していきましょう。
まずはHeatWave専用のMDSを作成します。
1.OCI Webコンソール画面から「MySQL」→「DBシステム」を選択します。
2.「MySQL DBシステムの作成」を選択します。
3. 必要な項目を入力していきます。今回はHeatWaveを使用するので「HeatWave」を選択します。
シェイプは「MySQL.HeatWave.VM.Standard.E3」を選択します。
2021年4月現在、HeatWaveを使用するには「MySQL.HeatWave.VM.Standard.E3」(CPUコア数:16 メモリーサイズ:512GB )シェイプしか選択肢が無いようです。
必要項目の入力が全て終わったら「作成」を選択し、MDSを作成します。
4. 10分ほどで作成が完了します。
検証準備
ここまででHeatWave用のMDSが立ち上がりました。
テストするにあたり、適当なテストデータを準備します。
今回は10件のレコードが入ったテスト用のテーブルを作成後、単純結合で大量のデータを生成します。
1. 作成したMDSに接続し、テスト用のデータベース「testdb」を作成します。
mysql> create database testdb;
2. テーブル「testtbl」を作成します。
mysql> CREATE TABLE testtbl
(id INT PRIMARY KEY AUTO_INCREMENT,
column1 VARCHAR(64),
column2 INT,
column3 INT);
3. 作成したテーブルにベースになる10件のレコードを登録します。
mysql> insert into testtbl (id, column1, column2, column3) values
(1, 'value1', 10, 100),
(2, 'value2', 20, 200),
(3, 'value3', 30, 300),
(4, 'value4', 40, 400),
(5, 'value5', 50, 500),
(6, 'value6', 60, 600),
(7, 'value7', 70, 700),
(8, 'value8', 80, 800),
(9, 'value9', 90, 900),
(10, 'value10', 100, 1000);
4. 10件入ったテーブルを8回単純結合します。処理に20分ほどかかりました。。。これで約1億件のデータが登録されました。
mysql> insert into testtbl (column1, column2, column3)
select s1.column1, s1.column2, s1.column3
from testtbl s1, testtbl s2, testtbl s3, testtbl s4, testtbl s5, testtbl s6,
testtbl s7, testtbl s8;
5. 念の為確認してみると1億10件のデータが登録されています。これでテスト準備は整いました!
mysql> select count(*) from testtbl;
+-----------+
| count(*) |
+-----------+
| 100000010 |
+-----------+
1 row in set (0.01 sec)
HeatWave機能の有効化
ここから実際にHeatWaveの機能を有効にしていきます。
1. OCI Webコンソール画面画面から先程作成したMDS画面を表示し、「HeatWave」項目の「有効化」を選択します。
2. SQLクエリを並列で実行するノード数を設定します。最低2ノードからとなります。ここで「ノード数の見積り」を選択します。
3. 「見積りの生成」を選択します。
4. HeatWaveを高速化するデータベースおよびテーブルを選択し、「ノード数見積りの適用」を選択します。
5. 「HeatWaveクラスタの追加」を選択します。
6. MDS画面の「リソース」→「HeatWave」画面を見ると、2ノード作成中となっています。
7. しばらく経つと状態がアクティブになりました。大体5〜10分ほどでアクティブになります。これでHeatWave機能が有効になりました。
高速化するテーブルをHeatWaveクラスタへ同期
HeatWave機能の有効後、高速化したいテーブルをHeatWaveクラスタへ同期させる必要があります。
ここからはmysqlコマンドでMDSへ接続して実施します。
1. HeatWave機能が有効であることを確認します。「Value」の値が「ONLINE」であればHeatWave機能が有効となります。
mysql> SHOW STATUS LIKE 'rapid_service_status';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| rapid_service_status | ONLINE |
+----------------------+--------+
1 row in set (0.00 sec)
2. SQLクエリを高速化するテーブルにHeatWaveを有効にする定義をします。
mysql> alter table testdb.testtbl secondary_engine=rapid;
3. テーブルのデータをHeatWaveクラスタへ同期します。
mysql> alter table testdb.testtbl secondary_load;
Query OK, 0 rows affected (5.14 sec)
4. 同期の進捗率を確認します。「VARIABLE_VALUE」の値が100になっていれば同期が完了しています。
mysql> SELECT VARIABLE_VALUE
-> FROM performance_schema.global_status
-> WHERE VARIABLE_NAME = 'rapid_load_progress';
+----------------+
| VARIABLE_VALUE |
+----------------+
| 100.000000 |
+----------------+
1 row in set (0.00 sec)
動作検証
ここまででHeatWaveの設定は一通り完了しました。
ではどのくらいクエリが早くなるのか検証してみましょう!
今回は単純にテーブルを全検索するようなselect文で速度を比較してみます。
1. まずHeatWaveが有効になっている状態でデータ数をカウントするselect文を実行してみます。
実行速度は0.53秒でした。
mysql> select count(column1) from testdb.testtbl;
+----------------+
| count(column1) |
+----------------+
| 100000010 |
+----------------+
1 row in set (0.53 sec)
2. では次にHeatWaveが無効の状態でテストしてみましょう。下記コマンドでテーブルデータをHeatWaveクラスタの同期状態を解除できます。
mysql> alter table testdb.testtbl secondary_unload;
Query OK, 0 rows affected (0.04 sec)
3. HeatWave無効の状態で先程と同じselect文を実行してみます。
実行速度は16.56秒!だいぶ遅くなりましたね。
mysql> select count(column1) from testdb.testtbl;
+----------------+
| count(column1) |
+----------------+
| 100000010 |
+----------------+
1 row in set (16.56 sec)
4. もう一度HeatWaveを有効にしてみます。
mysql> alter table testdb.testtbl secondary_load;
Query OK, 0 rows affected (4.58 sec)
5. 同じselect文を実行してみます。
実行速度は0.16秒!全然違いますね。明らかにクエリの実行速度が早くなりました!
mysql> select count(column1) from testdb.testtbl;
+----------------+
| count(column1) |
+----------------+
| 100000010 |
+----------------+
1 row in set (0.16 sec)
まとめ
今回の環境ではHeatWaveが有効の場合、約30倍ほどの速度が確認出来ました!
今後、AWS Auroraなど他社サービスとの比較もしてみたいと思います。
高速読み込みが必要なサービスを提供している方々は是非ご利用してみては如何でしょうか?
本記事がお役に立てば幸いです!