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

PolarDB:インデックス\ヒント

最終更新日:Mar 29, 2026

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