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

PolarDB:グローバルセカンダリインデックスの使用

最終更新日:May 24, 2024

PolarDB-X 1.0は、グローバルセカンダリインデックス (GSI) をサポートします。 このトピックでは、GSIを作成してGSI機能を使用する方法について説明します。

前提条件

MySQLのバージョンは5.7以降で、カーネルのマイナーバージョンは5.4.1以降である必要があります。

GSIの作成

PolarDB-X 1.0には、GSIの定義に使用される構文を追加することにより、MySQLデータ定義言語 (DDL) 構文が拡張されています。 構文の使用法は、MySQLでインデックスを作成するために使用される構文の使用法と同じです。

  • テーブルを作成するときにGSIを定義する 1
  • テーブルの作成後にGSIを追加する 2
説明
  • インデックス名: インデックステーブルを作成するためのインデックステーブルの名前として使用されます。
  • インデックス列: インデックステーブルのシャードキー、つまり、インデックスのシャーディング句で使用されるすべての列。
  • 対象となる列: インデックステーブルの他の列。 デフォルトでは、プライマリテーブルのプライマリキーとすべてのシャードキーが含まれています。
  • インデックスのシャーディング句: インデックステーブルのシャーディングアルゴリズム。 その構文は、CREATE TABLEのシャーディング句の構文と同じです。

# テーブルを作成するときに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') カバー ('id' 、'order_id' 、'buyer_id' 、'order_snapshot') dbpartition by hash('seller_id')
) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id');
# GSIを追加します。
ユニークなグローバルインデックスを作成 'g_i_buyer 'ON 't_order'('buyer_id') 
    カバー ('seller_id' 、'order_snapshot ') 
    tbpartition by hash('buyer_id') tbpartition by hash('buyer_id') tbpartitions 3 
説明 GSIの作成方法の詳細については、「create INDEX」をご参照ください。

GSIを使用する

GSIを作成した後、次の方法を使用して、クエリでインデックステーブルを使用できるようにします。

  • HINTを使用したインデックスの指定

    次の2つのHINTステートメントのいずれかを選択して、クエリのインデックスを指定して使用できます。

    • ステートメント:
      FORCE INDEX({index_name})
      例:
      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:INDEX({table_name/table_alias}, {index_name})*/
      例:
      /* + TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123
      説明 クエリでインデックスに含まれていない列が必要な場合は、最初にインデックステーブルをクエリして、記録されたすべてのプライマリキーとプライマリテーブルのシャードキーを取得できます。 次に、プライマリテーブルを照会して、不足している列の値を取得します。 詳細については、「INDEX HINT」をご参照ください。
  • インデックステーブルを直接照会する

    インデックステーブルにクエリに必要なすべての列が含まれている場合は、インデックステーブルを直接クエリして結果を取得できます。

  • インデックスの選択

    GSIを持つプライマリテーブルのクエリの場合、PolarDB-X 1.0は、オプティマイザが最小コストと見なすインデックステーブルを自動的に選択します。 カバーインデックスのみを選択できます。

    次のSQLクエリでは、プライマリテーブルはt_orderです。 seller_id同等性フィルターが含まれており、idorder_snapshotseller_idなどの関連する列は、GSI g_i_sellerによってカバーされます。 g_i_seller_coveringインデックスを使用すると、プライマリテーブルにクエリを行う必要がなくなり、テーブルシャーディングのスキャン数が大幅に削減されます。 seller_idは、g_i_sellerのシャードキーです。 EXPLAINの結果は、PolarDB − X 1.0オプティマイザがg_i_sellerを選択することを示す。

    EXPLAIN SELECT t_order.id,t_order.order_snapshot FROM t_order WHERE t_order.seller_id = 's1';
    IndexScan(tables="g_i_seller_sfL1_2" 、sql="SELECT 'id' 、'order_snapshot' FROM 'g_i_seller 'AS 'g_i_seller' WHERE ('seller_id' = ?)") 
  • インデックスの無視とインデックスの使用

    次のHINTを使用して、オプティマイザが一部のインデックスを使用するか使用しないかを有効にできます。

    • ステートメント:
      IGNORE INDEX({index_name},...)

      例:

      SELECT t_order.id、t_order.order_snapshot FROM t_order IGNORE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';
    • ステートメント:
      USE INDEX({index_name},...)
      例:
      SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';