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

PolarDB:INDEXヒントの使用方法

最終更新日:Jun 04, 2024

PolarDB-Xはグローバルセカンダリインデックスをサポートしています。 INDEXヒントを使用して、指定したグローバルセカンダリインデックスからデータをクエリできます。

制限事項

INDEXヒントは、SELECTステートメントでのみ使用できます。

注意

PolarDB-Xは、/* + TDDL:hint_command */ および /* + TDDL:hint_command */ 形式のカスタムヒントをサポートします。 /* + TDDL:hint_command */ 形式を使用する場合、MySQLコマンドラインクライアントを使用してカスタムPolarDB-Xヒントを含むSQLステートメントを実行するときに、ログオンコマンドで -cオプションを指定する必要があります。 このオプションを指定しない場合、カスタムヒントはSQL文のcommentsの形式で定義されているため、クライアントはステートメントをPolarDB-Xサーバーに送信して実行する前にステートメントからカスタムヒントを削除します。 その結果、カスタムPolarDB-Xヒントは有効になりません。 詳細については、mysqlの公式WebサイトのMySQLクライアントオプションを参照してください。

構文

PolarDB-Xは、次の種類のINDEXヒント構文をサポートしています。

  • FORCE INDEX(): FORCE INDEX() の構文は、MySQL FORCE INDEXの構文と同じです。 ヒント内の指定されたインデックスがグローバルセカンダリインデックスでない場合、FORCE indexヒントがMySQLエンジンに送信されて実行されます。
    # FORCE INDEX()
    tbl_name [[AS] エイリアス] [index_hint]
    index_hint:
        FORCE INDEX({index_name}) 
  • INDEX(): INDEX() を使用してヒントを定義すると、指定されたテーブル名とインデックス名の組み合わせ、または指定されたテーブルエイリアスとインデックス名の組み合わせに基づいて、グローバルセカンダリインデックスが指定されます。
    # INDEX()
    /* + TDDL:
        インデックス ({table_name | table_alias}, {index_name})
    */ 
    説明 ヒントステートメントは、次のシナリオでは有効になりません。
    • 指定されたテーブル名またはエイリアスは存在しません。
    • 指定されたインデックスは、指定されたテーブルのグローバルセカンダリインデックスではありません。

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_sellerグローバルセカンダリインデックスを指定します。
    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を使用して、テーブルエイリアスを指定してg_i_buyerグローバルセカンダリインデックスを指定します。
    /* + TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123