PolarDB-X 1.0は、グローバルセカンダリインデックス (GSI) をサポートします。 このトピックでは、INDEX HINTコマンドを使用して、指定されたGSIからクエリ結果を取得する方法について説明します。
制限事項
ApsaraDB RDS for MySQLインスタンスのバージョンは5.7以降である必要があり、PolarDB-X 1.0インスタンスのバージョンは5.4.1以降である必要があります。
INDEX HINTコマンドは、SELECT文に対してのみ有効です。
注意事項
カスタムPolarDB-X 1.0ヒントは、/* + TDDL:hint_command */ および /! + TDDL:hint_command */ /* + TDDL:hint_command */ 形式を使用する場合、MySQLコマンドラインクライアントを使用してカスタムのPolarDB-X 1.0ヒントを含むSQLステートメントを実行するときに、ログオンコマンドに -cパラメーターを追加します。 それ以外の場合、クライアントは、カスタムのPolarDB-X 1.0ヒントを表すMySQLコメントをSQLステートメントから削除し、そのステートメントを実行のためにサーバーに送信します。 その結果、カスタムPolarDB-X 1.0ヒントは無効になります。 詳細については、「MySQLクライアントオプション」をご参照ください。
構文
PolarDB-X 1.0は、次の2種類のヒント構文をサポートしています。
FORCE INDEX(): その構文は、MySQL FORCE INDEXの構文と同じです。 指定されたインデックスがGSIでない場合、FORCE indexヒントがApsaraDB RDS for MySQLインスタンスに送信されて実行されます。# FORCE INDEX() tbl_name [[AS] エイリアス] [index_hint] index_hint: FORCE INDEX({index_name})INDEX(): テーブル名とインデックス名の組み合わせ、または現在のクエリブロックのテーブルエイリアスとインデックス名の組み合わせに基づいて、GSIを指定します。# INDEX() /* + TDDL: インデックス ({table_name | table_alias}, {index_name}) */説明上記のステートメントは、次のシナリオでは有効になりません。
指定されたテーブル名またはエイリアスがクエリに含まれていません。
指定されたGSIは指定されたテーブルにありません。
例
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_sellerGSIを指定します。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";インデックス名とテーブルエイリアスの組み合わせを使用して、
g_i_buyerGSIを指定します。/* + TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123