このトピックでは、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') | + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +