PolarDB-X 1.0 では、グローバルセカンダリインデックス (GSI) をサポートしています。`INDEX HINT` を使用すると、オプティマイザーによる自動選択ではなく、特定の GSI を明示的に読み取るように `SELECT` クエリを強制できます。
使用制限
インデックスヒントは、`SELECT` 文でのみ有効です。
ApsaraDB RDS for MySQL インスタンスは、MySQL 5.7 以降を実行している必要があります。
PolarDB-X 1.0 インスタンスは、バージョン 5.4.1 以降を実行している必要があります。
構文
PolarDB-X 1.0 では、2 種類のインデックスヒント構文をサポートしています。
| 構文 | 動作の仕組み | 使用するタイミング |
|---|---|---|
FORCE INDEX(index_name) | `MySQL FORCE INDEX` と同一の動作です。指定されたインデックスが GSI でない場合、このヒントは ApsaraDB RDS for MySQL インスタンスに転送されます。 | MySQL 互換のインライン構文を使用したい場合 |
/*+TDDL: INDEX(table, index)*/ | 現在のクエリブロック内で、テーブル名(またはエイリアス)およびインデックス名を指定して GSI を対象とする TDDL ヒントです。 | TDDL ヒント構文を用いて、GSI を明示的に指定したい場合 |
FORCE INDEX
tbl_name [[AS] alias] FORCE INDEX({index_name})INDEX(TDDL ヒント)
/*+TDDL:
INDEX({table_name | table_alias}, {index_name})
*/- クエリが指定されたテーブル名またはエイリアスを参照していない場合。
- 指定された GSI が、指定されたテーブルに属していない場合。
注意事項
PolarDB-X 1.0 のヒントでは、2 種類のコメント形式がサポートされています:
/*+TDDL:hint_command*//! +TDDL:hint_command*/
MySQL コマンドラインクライアントで `/*+TDDL:hint_command*/` 形式を使用する場合は、ログインコマンドに `-c` オプションを追加してください。`-c` オプションを指定しないと、クライアントが SQL ステートメントをサーバーに送信する前に MySQL コメントを削除してしまうため、ヒントが静かに無視されてしまいます。
詳細については、「MySQL クライアントのオプション」をご参照ください。
例
以下の例では、次のテーブルを使用します。このテーブルには 2 つの GSI があります:g_i_seller(seller_id でパーティション化されたもの)および g_i_buyer(buyer_id でパーティション化されたもの)。
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`);FORCE INDEX を使用して g_i_seller を対象とする
FROM 句で `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";TDDL ヒントを使用して g_i_buyer を対象とする
テーブルエイリアス `a` とインデックス名を組み合わせて `g_i_buyer` GSI を対象とします:
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123;