データ分析は、過去に何が起こったかを確認して、既存のデータを使用して賢明な意思決定を行ったり、将来の行動を予測したりできるため、どの企業でも重要です。
大量のデータを分析するのは難しい場合があり、OLTPおよびOLAPワークロードを処理するには、複数のデータベースエンジンを使用する必要があります。このブログでは、HeatWaveとは何か、そしてそれがこのタスクでどのように役立つかを見ていきます。
HeatWaveとは何ですか?
HeatWaveは、クラウド内のMySQLデータベースサービス用の新しい統合エンジンです。これは、分析クエリの高速実行用に設計された、分散型、スケーラブル、シェアードナッシング、インメモリ、列型のクエリ処理エンジンです。公式ドキュメントによると、分析クエリのMySQLパフォーマンスを400倍高速化し、数千コアにスケールアウトし、直接の競合他社の約3分の1のコストで2.7倍高速になります。 HeatWaveを備えたMySQLデータベースサービスは、MySQLデータベースから直接OLTPおよびOLAPワークロードを実行するための唯一のサービスです。
HeatWaveの仕組み
HeatWaveクラスターには、MySQLDBシステムノードと2つ以上のHeatWaveノードが含まれます。 MySQL DBシステムノードには、クラスター管理、HeatWaveクラスターへのデータのロード、クエリスケジューリング、およびクエリ結果のMySQLDBシステムへの返送を担当するHeatWaveプラグインがあります。 HeatWaveノードはデータをメモリに保存し、分析クエリを処理します。各HeatWaveノードには、HeatWaveのインスタンスが含まれています。
必要なHeatWaveノードの数は、データのサイズと、データをHeatWaveクラスターにロードするときに達成される圧縮の量によって異なります。この製品のアーキテクチャは、次の画像で確認できます。
ご覧のとおり、ユーザーはHeatWaveクラスターに直接アクセスしません。特定の前提条件を満たすクエリは、処理を高速化するためにMySQL DBシステムからHeatWaveクラスターに自動的にオフロードされ、結果はMySQL DBシステムノードに返され、クエリを発行したMySQLクライアントまたはアプリケーションに返されます。
この機能を有効にするには、Oracle Cloud Management Siteにアクセスし、既存のMySQL DBシステムにアクセスして(または新しいシステムを作成して)、AnalitycsClusterを追加する必要があります。ここで、クラスターのタイプとノードの数を指定できます。ノード数の見積もり機能を使用して、ワークロードに基づいて必要な数を知ることができます。
HeatWaveクラスターにデータをロードするには、MySQL DBシステムでテーブルを準備し、テーブルのロード操作を実行する必要があります。
テーブルの準備には、テーブル定義を変更して特定の列を除外し、文字列列エンコーディングを定義し、データ配置キーを追加し、テーブルのセカンダリエンジンとしてHeatWave(RAPID)を指定する必要があります。これはInnoDBがプライマリエンジンであるためです。
RAPIDをテーブルのセカンダリエンジンとして定義するには、CREATETABLEまたはALTERTABLEステートメントでSECONDARY_ENGINEテーブルオプションを指定します。
mysql> CREATE TABLE orders (id INT) SECONDARY_ENGINE = RAPID;
or
mysql> ALTER TABLE orders SECONDARY_ENGINE = RAPID;
テーブルをHeatWaveクラスターにロードするには、SECONDARY_LOADキーワードを指定してALTERTABLE操作を実行する必要があります。
mysql> ALTER TABLE orders SECONDARY_LOAD;
テーブルが読み込まれると、データは水平方向にスライスされ、HeatWaveノードに分散されます。テーブルがロードされた後、MySQL DBシステムノード上のテーブルのデータへの変更は、HeatWaveノードに自動的に伝播されます。
この例では、テーブルの順序を使用します:
mysql> SHOW CREATE TABLE orders\G
*************************** 1. row ***************************
Table: orders
Create Table: CREATE TABLE `orders` (
`O_ORDERKEY` int NOT NULL,
`O_CUSTKEY` int NOT NULL,
`O_ORDERSTATUS` char(1) COLLATE utf8mb4_bin NOT NULL,
`O_TOTALPRICE` decimal(15,2) NOT NULL,
`O_ORDERDATE` date NOT NULL,
`O_ORDERPRIORITY` char(15) COLLATE utf8mb4_bin NOT NULL,
`O_CLERK` char(15) COLLATE utf8mb4_bin NOT NULL,
`O_SHIPPRIORITY` int NOT NULL,
`O_COMMENT` varchar(79) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`O_ORDERKEY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
HeatWaveにロードしたくない列を除外できます:
mysql> ALTER TABLE orders MODIFY `O_COMMENT` varchar(79) NOT NULL NOT SECONDARY;
ここで、テーブルのRAPIDをSECONDARY_ENGINEとして定義します。
mysql> ALTER TABLE orders SECONDARY_ENGINE RAPID;
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SECONDARY_ENGINE=RAPID
最後に、テーブルをHeatWaveにロードします:
mysql> ALTER TABLE orders SECONDARY_LOAD;
EXPLAINを使用して、正しいエンジンを使用しているかどうかを確認できます。次のように表示されます:
追加:whereを使用します。一時的な使用; filesortの使用;セカンダリエンジンRAPIDの使用
MySQLの公式サイトで、通常の実行とHeatWaveの使用の比較を確認できます:
HeatWaveの実行
mysql> SELECT O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM orders
WHERE O_ORDERDATE >= DATE '1994-03-01' GROUP BY O_ORDERPRIORITY
ORDER BY O_ORDERPRIORITY;
+-----------------+-------------+
| O_ORDERPRIORITY | ORDER_COUNT |
+-----------------+-------------+
| 1-URGENT | 2017573 |
| 2-HIGH | 2015859 |
| 3-MEDIUM | 2013174 |
| 4-NOT SPECIFIED | 2014476 |
| 5-LOW | 2013674 |
+-----------------+-------------+
5 rows in set (0.04 sec)
mysql> SELECT O_ORDERPRIORITY, COUNT(*) AS ORDER_COUNT FROM orders
WHERE O_ORDERDATE >= DATE '1994-03-01' GROUP BY O_ORDERPRIORITY
ORDER BY O_ORDERPRIORITY;
+-----------------+-------------+
| O_ORDERPRIORITY | ORDER_COUNT |
+-----------------+-------------+
| 1-URGENT | 2017573 |
| 2-HIGH | 2015859 |
| 3-MEDIUM | 2013174 |
| 4-NOT SPECIFIED | 2014476 |
| 5-LOW | 2013674 |
+-----------------+-------------+
5 rows in set (8.91 sec)
ご覧のとおり、単純なクエリであっても、クエリの時間には重要な違いがあります。詳細については、公式ドキュメントを参照してください。