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 まで) のそれぞれに対して、個別のセッションで同様のステートメントを実行します。