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

PolarDB:指定されたデータベースシャードで SQL ステートメントを実行する

最終更新日:Mar 29, 2026

NODE HINT は、PolarDB-X 1.0 のデフォルトのルーティングロジックをバイパスし、SQL ステートメントを 1 つ以上の指定されたデータベースシャードにルーティングします。この機能は PolarDB-X 1.0 V5.3 以降でサポートされています。

本トピックは、PolarDB-X 1.0 V5.3 以降に適用されます。

ユースケース

  • サポートされていない SQL ステートメント:PolarDB-X 1.0 が特定の SQL ステートメントをサポートしていない場合、NODE HINT を使用して、そのステートメントを下位のデータベースシャードに直接送信し、実行できます。

  • シャード固有のクエリ:特定のデータベースシャード、またはその中の特定のテーブルシャードに対してデータをクエリする必要がある場合、NODE HINT を使用して対象のシャードを直接指定できます。

仕組み

本ドキュメント内のすべての例は、以下のパターンに従います:

  1. SHOW NODE を実行して、データベースシャードの一覧とその名前を表示します。

  2. 対象とするシャードの名前をコピーします。

  3. node() ヒント内にシャード名を埋め込み、それを SQL ステートメントの先頭に配置します。

  4. MySQL コマンドラインクライアントで SQL ステートメントを実行します。標準の /*+TDDL:*/ ヒント形式を使用する場合は、-c フラグを付与してください。付与しないと、クライアントがサーバーにステートメントを送信する前にコメントを削除してしまいます。

構文

NODE HINT では、シャード名をルーティング先として使用します。シャード名は、PolarDB-X 1.0 データベース内におけるデータベースシャードの固有識別子です。SHOW NODE を実行することで、シャード名を取得できます。

PolarDB-X 1.0 では、以下の 2 種類のヒント形式がサポートされています:

形式構文備考
標準/*+TDDL:hint_command*/-c フラグを MySQL コマンドラインクライアントで指定する必要があります。指定しないと、クライアントがサーバーにステートメントを送信する前にコメントを削除してしまいます。詳細については、「トラブルシューティング」をご参照ください。
代替/!+TDDL:hint_command*/-c フラグを指定する必要はありません。

単一のシャードへのルーティング:

/*+TDDL:node('node_name')*/

複数のシャードへのルーティング:

/*+TDDL:node('node_name'[,'node_name1','node_name2'])*/

複数のシャード名はカンマで区切ります。

重要

NODE HINT を使用して SQL ステートメントを実行する場合、ステートメント内のテーブル名は指定されたシャードに存在している必要があります。INSERT ステートメント内で対象テーブルのシーケンス定義を含む NODE HINT を使用した場合、そのシーケンスは有効になりません。詳細については、「使用制限」をご参照ください。

NODE HINT は、DML、DDL、およびデータアクセス言語(DAL)ステートメントで使用できます。

以下の例では、drds_test という名前の PolarDB-X 1.0 データベースを使用します。

シャード名の取得

SHOW NODE を実行して、シャードとその名前を一覧表示します:

mysql> SHOW NODE\G

出力例:

*************************** 1. 行 ******************
                 ID: 0
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS
  MASTER_READ_COUNT: 212
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 2. 行 ******************
                 ID: 1
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0001_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
...
8 行がセットされました (0.02 秒)

NAME フィールドが各シャードの固有識別子です。たとえば、DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0003_RDS は物理データベースシャード drds_test_vtla_0003 に対応します。

単一のシャードへのルーティング

シャード 0 で SELECT ステートメントを実行します:

SELECT /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ * FROM table_name;

複数のシャードへのルーティング

シャード 0 およびシャード 6 で SELECT ステートメントを実行します:

SELECT /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS','DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS')*/ * FROM table_name;

このステートメントは、DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS シャードおよび DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS シャードの両方で実行されます。

シャード上の物理実行計画の表示

/*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ EXPLAIN SELECT * FROM table_name;

物理テーブル名

  • ランダム接尾辞(DRDS V5.4.1 以降):PolarDB-X 1.0 では、テーブルシャードの物理テーブル名に 4 文字のランダム文字列が付加されます。SHOW TOPOLOGY を実行すると、論理テーブルとその物理テーブル間のトポロジー関係を確認できます。

  • ランダム接尾辞の無効化(DRDS V5.4.4 以降):PolarDB-X 1.0 では、物理テーブル名にランダム文字列を含めるかどうかを制御する ENABLE_RANDOM_PHY_TABLE_NAME スイッチが提供されています。このスイッチはデフォルトで有効になっています。

    • インスタンス内のすべてのテーブルについて無効化するには:DRDS コンソールにログインし、インスタンス ID をクリックして左側のナビゲーションウィンドウから パラメーター設定 を選択し、データベース タブをクリックして、ENABLE_RANDOM_PHY_TABLE_NAMEfalse に設定します。

    • 単一のステートメント内で特定のテーブルについて無効化するには、次のヒントを使用します:/*+TDDL:cmd_extra(ENABLE_RANDOM_PHY_TABLE_NAME=FALSE)*/

トラブルシューティング

MySQL コマンドラインクライアントで NODE HINT が効かない

原因:標準のヒント形式 (/*+TDDL:hint_command*/) を使用した場合、MySQL コマンドラインクライアントがサーバーにステートメントを送信する前にコメントを削除してしまうため、PolarDB-X 1.0 がヒントを受信できません。

解決策:MySQL コマンドラインクライアントにログインする際に -c フラグを指定します:

mysql -h <host> -P <port> -u <username> -p -c

-c フラグにより、クライアントがコメントを保持するようになります。詳細については、「mysql クライアントのオプション」をご参照ください。

また、/!+TDDL:hint_command*/ 形式を使用することも可能です。こちらは -c フラグを指定する必要はありません。

次のステップ

  • 使用制限 — シーケンスの制限およびプライマリキーの競合に関するトラブルシューティング方法

  • MySQL のコメント — MySQL コメント構文のリファレンス