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

PolarDB:CREATE INDEX

最終更新日:May 28, 2024

このトピックでは、CREATE INDEXステートメントを使用して、ローカルセカンダリインデックス (LSI) またはグローバルセカンダリインデックス (GSI) を作成する方法について説明します。

注意

GSIを含むテーブルでALTERステートメントを実行するには、MySQLバージョンが5.7以降で、PolarDB-X 1.0バージョンがV5.4.1以降であることを確認します。

LSI

詳細については、「CREATE INDEXステートメント」をご参照ください。

GSI

構文

CREATE [ユニーク]
    グローバルインデックスindex_name [index_type]
    ON tbl_name (index_sharding_col_name,...)
    global_secondary_index_option
    [index_option]
    [algorithm_option | lock_option] ...

# GSI固有の構文。 詳細については、「MySQLのCREATE TABLEステートメント」をご参照ください。
global_secondary_index_option:
    [COVERING (col_name,...)]
    drds_partition_options

# シャーディングのための条項。 詳細については、「MySQLのCREATE TABLEステートメント」をご参照ください。
drds_partition_options:
    db_sharding_algorithmによるDBPARTITION
    [TBPARTITION BY {table_sharding_algorithm} [TBPARTITIONS num]]

db_sharding_algorithm:
    HASH([col_name])
  | {YYYYMM | YYYYWEEK | YYYYDD | YYYYMM_OPT | YYYYWEEK_OPT | YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)

table_sharding_algorithm:
    HASH(col_name)
  | {MM | DD | WEEK | MMDD | YYYYMM | YYYYWEEK | YYYYYYWEEK | YYYYMM_OPT | YYYYYYWEEK_OPT | YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)

 # 次のサンプルコードでは、MySQLエンジンでサポートされているDDL構文を使用しています。index_sharding_col_name:
    col_name [(length)] [ASC | DESC] # lengthパラメータは、インデックステーブルのシャードキーにLSIを作成するためにのみ使用されます。

index_option:
    KEY_BLOCK_SIZE [=] 値
  | index_type
  | PARSER parser_name付き
  | コメント '文字列'

index_type:
    USING {BTREE | ハッシュ}

algorithm_option:
    ALGORITHM [=] {デフォルト | INPLACE | コピー}

lock_option:
    LOCK [=] {デフォルト | NONE | 共有 | 排他的} 

CREATE GLOBAL INDEXステートメントは、テーブルの作成後にテーブルのGSIを作成するために使用されます。 このステートメントは、MySQLのCREATE INDEXステートメントにGLOBALキーワードを導入します。 このキーワードは、作成するインデックスの型がGSIであることを指定します。 テーブルの作成後、テーブルのGSIの作成には制限が課されます。 GSIの制限の詳細については、「GSIの使用に関する注意事項」をご参照ください。

GSIの定義に使用される句の詳細については、「CREATE TABLE」をご参照ください。

次の例は、テーブルの作成後にテーブルに共通のGSIを作成する方法を示しています。

  • 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') 、
      KEY 'L_i_order ' ('order_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id');
    # GSIを作成します。
    ALTER TABLE t_order ADD UNIQUEグローバルインデックス 'g_i_buyer ' ('buyer_id') カバー ('order_snapshot') dbpartition by hash('buyer_id'); 
    • プライマリテーブル: プライマリテーブルt_orderのデータはデータベースシャードに分割されますが、テーブルシャードにはさらに分割されません。 データベースは、order_id列に基づくハッシュシャーディングを使用します。

    • インデックステーブル: インデックステーブルg_i_buyerのデータはデータベースシャードに分割されますが、テーブルシャードには分割されません。 データベースは、buyer_id列に基づいてハッシュシャーディングを使用します。 order_snapshot列をカバー列として指定します。

    • GSIを定義するために使用される条項: GLOBAL INDEX 'g_i_buyer 'ON t_order ('buyer_id') dbpartition by hash('buyer_id')

  • 次のサンプルコードは、SHOW INDEXステートメントを実行して、order_idシャードキーのLSIと、buyer_id、id、order_id、およびorder_snapshotのGSIを含むインデックスに関する情報を表示する方法を示しています。 buyer_idは、インデックステーブルのシャードキーです。 idとorder_idはデフォルトのカバー列です。 idはプライマリキーで、order_idはプライマリテーブルのシャードキーです。 order_snapshotは、明示的に指定されたカバー列です。

    mysql> t_orderからインデックスを表示します。---------------- -----------------------------------------------------------------------------------
    | テーブル | NON_UNIQUE | KEY_NAME | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULL | INDEX_TYPE | COMMENT | INDEX_COMMENT |
    ---------------- -----------------------------------------------------------------------------------
    | t_order | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | |
    | t_order | 1 | l_i_order | 1 | order_id | A | 0 | NULL | NULL | YES | BTREE | |
    | t_order | 0 | g_i_buyer | 1 | buyer_id | NULL | 0 | NULL | NULL | YES | グローバル | インデックス | |
    | t_order | 1 | g_i_buyer | 2 | id | NULL | 0 | NULL | NULL | | グローバル | カバー | |
    | t_order | 1 | g_i_buyer | 3 | order_id | NULL | 0 | NULL | NULL | YES | グローバル | カバー | |
    | t_order | 1 | g_i_buyer | 4 | order_snapshot | NULL | 0 | NULL | NULL | YES | グローバル | カバー | |
    ---------------- -----------------------------------------------------------------------------------------------------------------
  • SHOW GLOBAL INDEXステートメントを実行して、GSI情報のみを表示できます。 詳細については、「SHOW GLOBAL INDEX」をご参照ください。

    mysql> t_orderからグローバルインデックスを表示します。+ --------------------- ------------------------------------------------- ------------------------------ --------------- +
    | スキーマ | テーブル | NON_UNIQUE | KEY_NAME | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_POLICY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_COUNTIUS
    + --------------------- ------------------------------------------------- ------------------------------ --------------- +
    | ZZY3_DRDS_LOCAL_APP | t_order | 0 | g_i_buyer | buyer_id | id、order_id、order_snapshot | NULL | buyer_id | HASH | 4 | | NULL | NULL | PUBLIC |
    + --------------------- ------------------------------------------------- ------------------------------ --------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +----------- 
  • 次のサンプルコードを使用して、インデックステーブルのスキーマを表示できます。 インデックステーブルには、プライマリテーブルのプライマリキー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 主キー列からAUTO_INCREMENT属性が削除されます。 LSIは、一次テーブルから除去される。 デフォルトでは、プライマリテーブルのグローバル一意制約を実現するために、GSIのすべてのインデックス列を含むローカル一意インデックスがインデックステーブルに作成されます。

    mysql> show create table g_i_buyer;
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
    | テーブル | テーブルの作成 |
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
    | g_i_buyer | CREATE TABLE 'g_i_buyer '(
      'id' bigint(11) NOT NULL、
      'order_id' varchar(20) DEFAULT NULL、
      'buyer_id 'varchar(20) デフォルトNULL、
      'order_snapshot' ロングテキスト、
      主要なキー ('id') 、
      ユニークなキー 'auto_shard_key_buyer_id ' ('buyer_id') BTREEを使用
    ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('buyer_id') |
    + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +