PolarDB-X はグローバルセカンダリインデックス (GSI) をサポートしています。オプティマイザーによる自動選択ではなく、インデックスヒントを使用してクエリを特定の GSI にルーティングできます。
制限事項
インデックスヒントは `SELECT` 文でのみサポートされています。
構文
PolarDB-X は、2 種類の INDEX ヒント構文をサポートしています。
FORCE INDEX
FORCE INDEX 構文は、MySQL の FORCE INDEX 標準に準拠しています。`FROM` 句にインラインで記述します。
tbl_name [[AS] alias] FORCE INDEX({index_name})指定されたインデックスが GSI でない場合、PolarDB-X はそのヒントを MySQL ストレージエンジンに転送します。
TDDL ヒント内の INDEX()
INDEX() ヒントは、/*+TDDL: ... */ コメントフォーマットで記述される PolarDB-X のカスタムヒントです。テーブル名 (またはエイリアス) とインデックス名を組み合わせて、ターゲットの GSI を指定します。
/*+TDDL:
INDEX({table_name | table_alias}, {index_name})
*/以下の場合、ヒントは効果がありません。
指定されたテーブル名またはエイリアスが存在しない。
指定されたインデックスがそのテーブルの GSI ではない。
注意事項
MySQL コマンドラインクライアント使用時の `-c` オプション
/*+TDDL:hint_command*/ フォーマットで TDDL ヒントを記述する場合、MySQL コマンドラインクライアントは、デフォルトで文をサーバーに送信する前にコメント形式のヒントを削除します。これを防ぐには、クライアントの起動時に -c オプションを渡してください。
mysql -h <host> -P <port> -u <user> -p -c-c オプションがない場合、ヒントは削除され、効果がありません。詳細については、MySQL ドキュメントサイトの「mysql Client Options」をご参照ください。
/!+TDDL:hint_command*/フォーマットは、MySQL クライアントによってコメントとして扱われず、-cオプションを必要としない代替手段です。
例
以下の例では、2 つの GSI を持つ次のテーブルを使用します。g_i_seller (seller_id でパーティション分割) と g_i_buyer (buyer_id でパーティション分割された一意の GSI) です。
CREATE TABLE t_order (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
GLOBAL INDEX `g_i_seller`(`seller_id`) dbpartition by hash(`seller_id`),
UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING(`seller_id`, `order_snapshot`)
dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);JOIN で FORCE INDEX を使用する
`FROM` 句で FORCE INDEX を使用して g_i_seller GSI を指定します。
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() を使用する
テーブルエイリアス a を使用して g_i_buyer GSI を指定します。
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123