このトピックでは、PolarDB for MySQL の列指向テーブルが提供する超並列処理(MPP)機能について、アーキテクチャ、ユースケース、ベストプラクティス、およびパフォーマンスベンチマークを含めて説明します。
列指向テーブルのマルチノード並列実行に関するご質問がある場合は、PolarDB テクニカルサポートまでお問い合わせください。
背景情報
列指向テーブルは、PolarDB 向けの OLAP ソリューションを提供します。クエリ対象のデータ量やクエリの複雑さが増加し、OSS などの外部テーブルへのクエリ需要も高まるにつれて、シングルの読み取り専用ノードでは大規模データ処理のパフォーマンス要件を満たせなくなる可能性があります。これを解決するために、列指向テーブルクラスターでは MPP 機能とリソースのエラスティックスケーリング機能を提供しています。
アーキテクチャ
MPP は複数の読み取り専用ノードを 1 つの実行グループにまとめ、クエリを並列で処理します。ワークロードの変化に応じて、読み取り専用ノードを追加または削除することで、クエリパフォーマンスとコンピューティングコストのバランスを調整できます。
前提条件
ご利用の PolarDB for MySQL クラスターは、以下の条件を満たしている必要があります。
エディション: Enterprise Edition。
エンジンバージョン: MySQL 8.0.2。マイナーバージョンは 8.0.2.2.34 以降である必要があります。
ユースケース
マルチノードのエラスティックリソースにより CPU および IOPS をスケールアウトし、クエリレイテンシーを低減します。
各ノードがデータの一部のみを処理することで、データキャッシング効率を向上させます。
ベストプラクティス
大規模データを分析する際の主な目標は、データ転送(シャッフル)を最小限に抑え、ディスク読み取り(I/O)を削減することです。PolarDB の列指向テーブルでは、パーティションキーおよびソートキーを使用して、最適なクエリパフォーマンスを実現できます。
パーティションキー
パーティションキーは、データを複数のノードに分散配置します。基本原則は、関連するデータを同じノード上に保持し、ローカルでの計算を可能にすることです。
仕組み
第 1 レベルまたは第 2 レベルで HASH または KEY パーティショニングを使用するパーティションテーブルの場合、マルチノード実行は共有なし(share-nothing)アプローチを採用します。各パーティションは単一のノードによって処理されます。
主なメリット
データキャッシングの改善:各ノードは割り当てられたパーティションのみを処理するため、ローカルメモリキャッシュをより効率的に活用できます。
クエリパフォーマンスの最適化:
JOINおよびGROUP BY操作をパーティションキーに基づいて実行すると、各ノード上でローカルにデータを処理できるため、ノード間のデータ転送が大幅に削減されます。
ベストプラクティス
コアとなるビジネスキーを使用:最も頻繁に
JOIN句またはGROUP BY句で使用されるカラム(例:order_idやuser_id)をパーティションキーとして選択します。パーティション数を一致させる:
JOIN操作に関与するテーブルは、HASH/KEY パーティションの数が完全に一致している必要があります。パーティション数が異なると、ローカル計算が不可能になります。パーティション数には大きな素数を使用:97 や 199 などの大きな素数をパーティション数として使用してください。これにより、ノード間でデータが均等に分散され、データスキューを防ぐことができます。
ソートキー
ソートキーは、各物理パーティション内のデータを整理します。基本原則は、読み取り時に不要なデータをスキップすることです。RANGE パーティションを使用するか、列指向テーブルにソートキーを追加することで、大量のデータを効率的にフィルタリングできます。
仕組み
列指向ストレージでは、データはストライプ単位で管理されます。ソートキーを設定すると、各ストライプ内のデータが指定されたカラムで物理的にソートされます。クエリ実行時、エンジンは各ストライプヘッダーに含まれる min/max 値などのメタデータを参照し、そのストライプを読み取るかスキップするかを判断します。
主なメリット
効率的なデータプルーニング:
WHERE句でソートキーに基づくフィルター条件を指定すると、クエリエンジンはフィルター条件に該当しないデータ範囲を持つストライプ全体をスキップします。これにより、ディスク I/O が削減されます。
ベストプラクティス
高頻度フィルター対象カラムを選択:
WHERE句で頻繁に使用されるカラム(特に範囲クエリ(>、<、BETWEEN)や高カーディナリティの等価クエリ)にソートキーを設定します。RANGE パーティションと併用:多段階のデータフィルタリングを実現するため、
RANGEパーティションとソートキーを組み合わせて使用します。
パフォーマンスベンチマーク
以下の表は、32 コア 256 GB のノードを 3 台使用した MPP クラスターにおける、TPC-H 1 TB ベンチマークの結果を示しています(列指向テーブル使用)。
本トピックで紹介する TPC-H 実装は TPC-H ベンチマークに基づいていますが、テストが TPC-H 要件をすべて満たしていないため、公開されている TPC-H ベンチマーク結果との比較はできません。
クエリ | 時間 (s) |
Q1 | 8.189 |
Q2 | 0.567 |
Q3 | 1.784 |
Q4 | 1.38 |
Q5 | 2.268 |
Q6 | 2.359 |
Q7 | 2.068 |
Q8 | 1.593 |
Q9 | 10.761 |
Q10 | 10.054 |
Q11 | 0.795 |
Q12 | 7.595 |
Q13 | 10.848 |
Q14 | 3.023 |
Q15 | 2.286 |
Q16 | 2.253 |
Q17 | 11.651 |
Q18 | 25.612 |
Q19 | 11.557 |
Q20 | 2.739 |
Q21 | 4.82 |
Q22 | 3.141 |
TOTAL | 127.343 |
よくある質問
SQL ステートメントが MPP を使用しているかどうかを確認する方法を教えてください。
SQL ステートメントの EXPLAIN 実行計画を分析することで、MPP を使用しているかどうかを判断できます。重要な指標は、Exchange オペレーターの有無です。
ステップ 1:MPP 計画の実行可能性を確認
まず、オプティマイザーが SQL ステートメントに対して MPP 計画を生成できるかどうかを特定のヒントを使用して検証します。
方法:SQL ステートメントの先頭に
EXPLAINを追加し、/*+ SET_VAR(imci_plan_use_mpp=forced) */ヒントを挿入します。これにより、オプティマイザーは強制的に MPP 実行計画を生成します。例
EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;結果:実行計画に
Exchangeオペレーターが含まれている場合、その SQL ステートメントはマルチノード並列実行を利用可能です。ステップ 2:実際の実行計画を確認
実行可能性を確認した後、ヒントなしで元の SQL ステートメントに対してオプティマイザーが実際に MPP モードを選択しているかどうかを確認します。
方法:元の SQL ステートメントに対して
EXPLAINを実行します。例
EXPLAIN SELECT COUNT(*) FROM nation;結果:
実行計画に
Exchangeオペレーターが含まれている場合、オプティマイザーはそのクエリに対してマルチノード並列実行を有効にしています。実行計画に
Exchangeオペレーターが含まれていない場合、以下のいずれかが原因である可能性があります。クエリがシンプルすぎる、または対象データ量が少なすぎるため、オプティマイザーがシングルノード実行の方が高速だと判断しています。
SQL 構文やテーブル構造(例:パーティションキーの設定)により、MPP の使用が制限されています。ステップ 1 を参考に、SQL またはテーブル設計を最適化してください。