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 を使用して対象のシャードを直接指定できます。
仕組み
本ドキュメント内のすべての例は、以下のパターンに従います:
SHOW NODEを実行して、データベースシャードの一覧とその名前を表示します。対象とするシャードの名前をコピーします。
node()ヒント内にシャード名を埋め込み、それを SQL ステートメントの先頭に配置します。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_NAMEをfalseに設定します。単一のステートメント内で特定のテーブルについて無効化するには、次のヒントを使用します:
/*+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 コメント構文のリファレンス