このトピックでは、PolarDB for MySQLクラスターでElastic Parallel Query (ePQ) 機能を使用して、コールドデータのクエリパフォーマンスを最適化する方法について説明します。
背景情報
Object Storage Service (OSS) テーブルに保存されるデータ量が増加すると、OSSテーブルのクエリパフォーマンスが低下し、ユーザーエクスペリエンスに大きな影響を与えます。 ePQ機能を使用して問題を解決できます。 ePQ機能は、スレッド数を増やすことでクエリの実行を大幅に高速化します。これにより、クエリプロセスが最適化され、データ取得効率が向上し、必要な情報への迅速なアクセスが保証されます。
説明
CSV形式のコールドデータに対してのみ並列クエリを実行できます。 並列クエリ実行機能は、異なるタスクを独立したワーカーに割り当てます。 ワーカーはOSSテーブルのCSVデータを並行してスキャンするため、クエリ速度が大幅に向上します。 次のテーブルは働くメカニズムを記述します。
サポートされているバージョン
クラスターは、次のバージョンとエディションの要件を満たす必要があります。
コールドデータに対する単一ノード並列クエリの実行:
データベースエンジン: リビジョンバージョンが8.0.1.1.34以降のMySQL 8.0.1。
エディション: Enterprise Edition /.
コールドデータに対する単一ノード並列クエリの実行:
データベースエンジン: リビジョンバージョンが8.0.2.2.24以降のMySQL 8.0.2。
エディション: Enterprise Edition。
コールドデータに対するマルチモード並列クエリの実行:
データベースエンジン: リビジョンバージョンが8.0.2.2.24以降のMySQL 8.0.2。
エディション: Enterprise Edition。
前提条件
クラスタへの接続が確立される。 詳細については、「クラスターへの接続」をご参照ください。
クラスターのコールドデータアーカイブ機能が有効になっています。 詳細については、「コールドデータアーカイブの有効化」をご参照ください。
ePQ機能が有効になっています。 詳細については、「elastic parallel queryの有効化」をご参照ください。
並列クエリを実行するコールドデータはCSV形式です。
loose_csv_max_oss_threadsパラメーターは、2以上の値に設定されます。
loose_csv_max_oss_threadsパラメーターは、ノード上で並列に実行できるOSSスレッドの最大数を指定します。 loose_csv_max_oss_threadsパラメーターの有効な値は1〜100です。 デフォルト値は 1 です。 デフォルト値を使用すると、コールドデータに対して並列クエリ実行を実行できません。 デフォルトでは、単一のOSSスレッドが128 MBのメモリを消費します。 クラスターの残りのメモリに基づいて、loose_csv_max_oss_threadsパラメーターの値を増やします。
使用量
これらの例では、TPC-Hベンチマークに基づく試験が行われる。 しかしながら、これらの試験は、TPC-Hのベンチマーク試験の全ての要件を満たすわけではない。 したがって、テスト結果は、公開されているTPC-Hベンチマークテスト結果と比較できません。 詳細については、「TPC-Hデータセット」をご参照ください。
コールドデータに対する並列クエリの実行を有効にするには、ePQ機能を有効にし、loose_csv_max_oss_threadsパラメーターを適切に大きな値に設定します。
例: lineitem
という名前のテーブルをOSSにアーカイブします。
mysql> show create table lineitem;
*************************** 1. row ***************************
Table: lineitem
Create Table: CREATE TABLE `lineitem` (
`l_orderkey` int(11) NOT NULL,
`l_partkey` int(11) NOT NULL,
`l_suppkey` int(11) NOT NULL,
`l_linenumber` int(11) NOT NULL,
`l_quantity` decimal(10,2) NOT NULL,
`l_extendedprice` decimal(10,2) NOT NULL,
`l_discount` decimal(10,2) NOT NULL,
`l_tax` decimal(10,2) NOT NULL,
`l_returnflag` char(1) NOT NULL,
`l_linestatus` char(1) NOT NULL,
`l_shipDATE` date NOT NULL,
`l_commitDATE` date NOT NULL,
`l_receiptDATE` date NOT NULL,
`l_shipinstruct` char(25) NOT NULL,
`l_shipmode` char(10) NOT NULL,
`l_comment` varchar(44) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='default_oss_server'
1 row in set (0.00 sec)
複数のメソッドを使用して、並列クエリ実行を有効にできます。 たとえば、クエリにヒント
を追加して、並列クエリ実行を有効にできます。 並列クエリの実行が有効になっているかどうかを確認するには、EXPLAINステートメントを実行し、[Extra]
列に並列スキャン
が表示されているかどうかを確認します。 列に表示されている場合は、並列クエリの実行が有効になります。 ワーカーの数は、並列度を表します。
シリアルクエリ実行
EXPLAIN文を実行し、[Extra]
列に [Parallel scan]
が表示されているかどうかを確認します。 列に表示されない場合、並列クエリの実行は無効になります。
mysql> explain SELECT
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 61560489 | 0.41 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (1.23 sec)
前の出力は、テーブルの集計計算とスキャンが1つのスレッドで順次実行されることを示します。 並列クエリの実行は無効です。
並列クエリ実行
クエリにヒント
(/* + PARALLEL(4) */) を追加して並列クエリの実行を有効にすると、実行プランは、lineitem
テーブルで並列クエリの実行が実行されることを示します。 実行計画の [Extra]
列に表示される [Parallel scan]
(4ワーカー) 情報は、クエリが4つのワーカースレッドによって並列に実行されることを示しています。
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 15390122 | 0.41 | Parallel scan (4 workers); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
2 rows in set, 1 warning (2.17 sec)
上記の出力は、現在のノードで4つのワーカーが有効になっていることを示します。 これは、並列クエリ実行が実行されることを意味する。 全体的なクエリ速度は、単一スレッドクエリの4倍です。
マルチノード並列クエリ
実行計画では、lineitem
テーブルのクエリでParallel scan
が使用されていることが示されています。 各ノードは4つのワーカーを使用し、合計2つのノードと8つのワーカーが並列実行に使用されます。 Extra
列には、ワーカーの数とノードの数が表示されます。
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 59986051 | 0.41 | Parallel scan (8 workers); MPP (2 nodes); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
上記の出力は、2つのノードと8つのスレッドが並列クエリに使用されることを示します。 マルチノード並列クエリの実行が有効になり、全体のクエリ速度はシングルスレッドクエリの8倍になります。