すべてのプロダクト
Search
ドキュメントセンター

PolarDB:インデックスヒント

最終更新日:Mar 29, 2026

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})
*/
説明 TDDL の `INDEX` ヒントは、以下のケースでは無効です:
  • クエリが指定されたテーブル名またはエイリアスを参照していない場合。
  • 指定された 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_sellerseller_id でパーティション化されたもの)および g_i_buyerbuyer_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;