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

PolarDB:インデックスヒント

最終更新日:May 24, 2024

PolarDB-X 1.0は、グローバルセカンダリインデックス (GSI) をサポートします。 このトピックでは、INDEX HINTコマンドを使用して、指定されたGSIからクエリ結果を取得する方法について説明します。

制限事項

  • ApsaraDB RDS for MySQLインスタンスのバージョンは5.7以降である必要があり、PolarDB-X 1.0インスタンスのバージョンは5.4.1以降である必要があります。

  • INDEX HINTコマンドは、SELECT文に対してのみ有効です。

注意事項

カスタムPolarDB-X 1.0ヒントは、/* + TDDL:hint_command */ および /! + TDDL:hint_command */ /* + TDDL:hint_command */ 形式を使用する場合、MySQLコマンドラインクライアントを使用してカスタムのPolarDB-X 1.0ヒントを含むSQLステートメントを実行するときに、ログオンコマンドに -cパラメーターを追加します。 それ以外の場合、クライアントは、カスタムのPolarDB-X 1.0ヒントを表すMySQLコメントをSQLステートメントから削除し、そのステートメントを実行のためにサーバーに送信します。 その結果、カスタムPolarDB-X 1.0ヒントは無効になります。 詳細については、「MySQLクライアントオプション」をご参照ください。

構文

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

  • FORCE INDEX(): その構文は、MySQL FORCE INDEXの構文と同じです。 指定されたインデックスがGSIでない場合、FORCE indexヒントがApsaraDB RDS for MySQLインスタンスに送信されて実行されます。

    # FORCE INDEX()
    tbl_name [[AS] エイリアス] [index_hint]
    index_hint:
        FORCE INDEX({index_name}) 
  • INDEX(): テーブル名とインデックス名の組み合わせ、または現在のクエリブロックのテーブルエイリアスとインデックス名の組み合わせに基づいて、GSIを指定します。

    # INDEX()
    /* + TDDL:
        インデックス ({table_name | table_alias}, {index_name})
    */ 
    説明

    上記のステートメントは、次のシナリオでは有効になりません。

    • 指定されたテーブル名またはエイリアスがクエリに含まれていません。

    • 指定されたGSIは指定されたテーブルにありません。

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 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"; 
  • インデックス名とテーブルエイリアスの組み合わせを使用して、g_i_buyer GSIを指定します。

    /* + TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123