PolarDB-Xはグローバルセカンダリインデックスをサポートしています。 INDEXヒントを使用して、指定したグローバルセカンダリインデックスからデータをクエリできます。
制限事項
INDEXヒントは、SELECTステートメントでのみ使用できます。
注意
PolarDB-Xは、/* + TDDL:hint_command */
および /* + TDDL:hint_command */
形式のカスタムヒントをサポートします。 /* + TDDL:hint_command */
形式を使用する場合、MySQLコマンドラインクライアントを使用してカスタムPolarDB-Xヒントを含むSQLステートメントを実行するときに、ログオンコマンドで -cオプションを指定する必要があります。 このオプションを指定しない場合、カスタムヒントはSQL文のcommentsの形式で定義されているため、クライアントはステートメントをPolarDB-Xサーバーに送信して実行する前にステートメントからカスタムヒントを削除します。 その結果、カスタムPolarDB-Xヒントは有効になりません。 詳細については、mysqlの公式WebサイトのMySQLクライアントオプションを参照してください。
構文
PolarDB-Xは、次の種類のINDEXヒント構文をサポートしています。
FORCE INDEX()
: FORCE INDEX() の構文は、MySQL FORCE INDEXの構文と同じです。 ヒント内の指定されたインデックスがグローバルセカンダリインデックスでない場合、FORCE indexヒントがMySQLエンジンに送信されて実行されます。# FORCE INDEX() tbl_name [[AS] エイリアス] [index_hint] index_hint: FORCE INDEX({index_name})
INDEX()
: INDEX() を使用してヒントを定義すると、指定されたテーブル名とインデックス名の組み合わせ、または指定されたテーブルエイリアスとインデックス名の組み合わせに基づいて、グローバルセカンダリインデックスが指定されます。# INDEX() /* + TDDL: インデックス ({table_name | table_alias}, {index_name}) */
説明 ヒントステートメントは、次のシナリオでは有効になりません。- 指定されたテーブル名またはエイリアスは存在しません。
- 指定されたインデックスは、指定されたテーブルのグローバルセカンダリインデックスではありません。
例
CREATE TAB_order (
'id' bigint(11) NOT NULL AUTO_INCREMENT、
'order_id' varchar(20) DEFAULT NULL、
'buyer_id 'varchar(20) デフォルトNULL、
'seller_id 'varchar(20) DEFAULT NULL、
'order_snapshot' ロングテキストDEFAULT NULL、
'order_detail' ロングテキストDEFAULT NULL、
主要なキー ('id') 、
グローバルインデックス 'g_i_seller '('seller_id') dbpartition by hash('seller_id') 、
ユニークなグローバルインデックス 'g_i_buyer ' ('buyer_id') COVERING('seller_id' 、'order_snapshot')
tbpartition by hash('buyer_id') tbpartition by hash('buyer_id') tbpartitions 3
) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id');
- FROM句で、FORCE INDEXを使用して
g_i_seller
グローバルセカンダリインデックスを指定します。SELECT a.*, b.order_id FROM t_seller a JOIN t_order b FORCE INDEX(g_i_seller) ON a.seller_id = b.seller_id WHERE a.seller_nick="abc";
- INDEXを使用して、テーブルエイリアスを指定して
g_i_buyer
グローバルセカンダリインデックスを指定します。/* + TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123