すべてのプロダクト
Search
ドキュメントセンター

PolarDB:効率的なデータスキャン方法

最終更新日:Mar 28, 2026

Distributed Relational Database Service (PolarDB-X 1.0) は、効率的なデータスキャンをサポートし、全表スキャン中に集計関数を使用して統計的要約を行います。大規模なデータセットの場合、SQL ヒントを使用して個々のシャードを直接ターゲットにすることで、すべてのテーブルシャードを並列でスキャンできます。

スキャンモード

PolarDB-X 1.0 は、クエリの構造に応じて異なる実行戦略を適用します。

シナリオPolarDB-X 1.0 の実行方法サポートされる集計関数
データベースまたはテーブルシャードなしSQL ステートメントをバックエンドの ApsaraDB RDS for MySQL インスタンスに直接渡しますすべての集計関数
非全表スキャン (WHERE 句でのシャードキーの等価性)単一の ApsaraDB RDS for MySQL インスタンスにルーティングしますすべての集計関数
全表スキャン (シャードキーフィルターなし)すべてのシャードにファンアウトし、結果をマージしますCOUNT、MAX、MIN、SUM。LIKE、ORDER BY、LIMIT、および GROUP BY もサポートします
すべてのテーブルシャードの並列スキャン各シャードはヒントを使用して直接クエリされます。セッションはご利用者様が管理しますシャードごとのクエリに依存します

全表スキャンでは、各シャードが部分的な集計をローカルで計算し、PolarDB-X 1.0 が結果をマージするため、COUNT、MAX、MIN、SUM のみがサポートされます。個々の行のクロスシャードの順序付けまたはグループ化を必要とする集計関数は、この方法ではプッシュダウンできません。

ヒントを使用したテーブルシャードのスキャン

エクスポート、監査、または分析のために特定のシャードからデータを読み取る必要がある場合は、TDDL ヒント構文を使用して個々のシャードを直接ターゲットにします。

ステップ 1: テーブルトポロジーの取得

テーブルの現在の物理レイアウトを確認するには、SHOW TOPOLOGY FROM <table_name> を実行します。

mysql> SHOW TOPOLOGY FROM DRDS_USERS;
+------+-------------------+--------------+
| ID   | GROUP_NAME        | TABLE_NAME   |
+------+-------------------+--------------+
|    0 | DRDS_00_RDS       | DRDS_USERS   |
|    1 | DRDS_01_RDS       | DRDS_USERS   |
+------+-------------------+--------------+
2 rows in set (0.06 sec)

出力には、各物理シャードがその GROUP_NAME と対応する物理テーブル名 (TABLE_NAME) でリストされます。最新のトポロジーを取得するために、各スキャンの前にこのコマンドを実行してください。テーブルの再構築後にシャードレイアウトが変更される可能性があります。

シャーディングされていないテーブルは、デフォルトでデータベースシャード 0 に保存されます。

ステップ 2: GROUP_NAME を使用した各シャードのクエリ

TDDL ヒント /! TDDL:node='<GROUP_NAME>'*/ を使用して、クエリを特定のシャードにルーティングします。ヒント内の GROUP_NAME は、SHOW TOPOLOGY 出力の GROUP_NAME 列と一致する必要があります。SQL ステートメントでは、論理テーブル名ではなく、物理テーブルシャード名 (TABLE_NAME 列から) を使用します。

シャード 0 (DRDS_00_RDS) で次のクエリを実行します。

/! TDDL:node='DRDS_00_RDS'*/ SELECT * FROM DRDS_USERS;

シャード 1 (DRDS_01_RDS) で次のクエリを実行します。

/! TDDL:node='DRDS_01_RDS'*/ SELECT * FROM DRDS_USERS;

トポロジー出力にリストされている各シャードに対して繰り返します。

テーブルシャードの並列スキャン

PolarDB-X 1.0 では、mysqldump を実行してデータをエクスポートできます。ただし、データをより高速にスキャンしたい場合は、複数のセッション (テーブルシャードごとに 1 つ) を開いて、すべてのシャードを同時にスキャンできます。

並列セッションの最大数は、テーブルシャードの総数に等しくなります。各セッションは正確に 1 つのテーブルシャードをターゲットとするため、シャード数よりも多くのセッションを開いても追加の利点はありません。

例: 次のトポロジーは、4 つのデータベースシャードとそれぞれ 3 つのテーブルシャードを持つテーブル、合計 12 のテーブルシャードを示しています。

mysql> SHOW TOPOLOGY FROM LJLTEST;
+------+----------------+------------+
| ID   | GROUP_NAME     | TABLE_NAME |
+------+----------------+------------+
|    0 | TDDL5_00_GROUP | ljltest_00 |
|    1 | TDDL5_00_GROUP | ljltest_01 |
|    2 | TDDL5_00_GROUP | ljltest_02 |
|    3 | TDDL5_01_GROUP | ljltest_03 |
|    4 | TDDL5_01_GROUP | ljltest_04 |
|    5 | TDDL5_01_GROUP | ljltest_05 |
|    6 | TDDL5_02_GROUP | ljltest_06 |
|    7 | TDDL5_02_GROUP | ljltest_07 |
|    8 | TDDL5_02_GROUP | ljltest_08 |
|    9 | TDDL5_03_GROUP | ljltest_09 |
|   10 | TDDL5_03_GROUP | ljltest_10 |
|   11 | TDDL5_03_GROUP | ljltest_11 |
+------+----------------+------------+
12 rows in set (0.06 sec)

最大 12 のセッションを並列で開き、各セッションが 1 つのテーブルシャードをターゲットにします。たとえば、TDDL5_00_GROUP 上の ljltest_00 をクエリするには、次のようにします。

/! TDDL:node='TDDL5_00_GROUP'*/ SELECT * FROM ljltest_00;

トポロジー出力からの対応する GROUP_NAME を使用して、残りの 11 のシャード (ljltest_01 から ljltest_11 まで) のそれぞれに対して、個別のセッションで同様のステートメントを実行します。