全部产品
Search
文档中心

PolarDB:CREATE INDEX (Mode AUTO)

更新时间:Jul 03, 2025

PolarDB-X mendukung pembuatan indeks lokal dan indeks sekunder global (GSIs), serta penghapusan jenis-jenis indeks ini. Sintaks ini hanya berlaku untuk database dalam mode AUTO.

Indeks lokal

Untuk informasi lebih lanjut tentang indeks lokal, lihat Pernyataan CREATE INDEX.

Catatan penggunaan

Jika Anda ingin menggunakan fitur terkait partisi tingkat-2 di GSIs, versi instance PolarDB-X Anda harus 5.4.17-16952556 atau lebih baru.

GSIs

Untuk informasi lebih lanjut tentang prinsip dasar GSIs, lihat GSI.

Syntax

CREATE [UNIQUE]
    GLOBAL INDEX index_name [index_type]    
    ON tbl_name (index_sharding_col_name,...)    
    global_secondary_index_option 
    [index_option] 
    [algorithm_option | lock_option] ...    
# Sintaks ini hanya berlaku untuk GSIs. Untuk informasi lebih lanjut, lihat dokumentasi pernyataan CREATE TABLE.  
global_secondary_index_option:   
    [COVERING (col_name,...)]
    [partition_options]
    [VISIBLE|INVISIBLE]

# Tentukan partisi.
partition_options:
	partition_columns_definition
	[subpartition_columns_definition]
	[subpartition_specs_definition]/* Tentukan partisi level-2 yang ditemplatkan.*/ 
  partition_specs_definition 

# Tentukan kolom kunci partisi level-1.
partition_columns_definition:
		PARTITION BY
          HASH({column_name | partition_func(column_name)}) partitions_count
        | KEY(column_list) partitions_count
        | RANGE({column_name | partition_func(column_name)}) 
        | RANGE COLUMNS(column_list)
        | LIST({column_name | partition_func(column_name)}) 
        | LIST COLUMNS(column_list)

# Tentukan kolom kunci partisi level-2.
subpartition_columns_definition:
		SUBPARTITION BY
          HASH({column_name | partition_func(column_name)}) subpartitions_count
        | KEY(column_list) subpartitions_count
        | RANGE({column_name | partition_func(column_name)}) 
        | RANGE COLUMNS(column_list)
        | LIST({column_name | partition_func(column_name)})
        | LIST COLUMNS(column_list)

partitions_count:
   PARTITIONS partition_count

subpartitions_count:
   SUBPARTITIONS partition_count

# Tentukan fungsi partisi.
partition_func:
    YEAR
  | TO_DAYS
  | TO_MONTHS
  | TO_WEEKS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH
  | DAYOFWEEK
  | DAYOFMONTH
  | DAYOFYEAR
  | SUBSTR
  | SUBSTRING


# Tentukan tiga jenis partisi level-1.
partition_specs_definition:
	hash_partition_list
  | range_partition_list
  | list_partition_list

# Tentukan tiga jenis partisi level-2.
subpartition_specs_definition:
	hash_subpartition_list
  | range_subpartition_list
  | list_subpartition_list

# Tentukan subpartisi HASH atau KEY dari partisi level-1.
hash_partition_list:
	  /* Semua subpartisi dalam partisi level-1 adalah tipe partisi HASH.*/
	| ( hash_partition [, hash_partition, ...] )

hash_partition:
    PARTITION partition_name [partition_spec_options] /* Tentukan partisi murni level-1 atau subpartisi yang ditemplatkan.*/
  | PARTITION partition_name subpartitions_count [subpartition_specs_definition] /* Tentukan subpartisi non-ditemplatkan di bawah partisi level-1.*/

# Tentukan subpartisi HASH atau KEY dari partisi level-2.
hash_subpartition_list:
  | empty
  | ( hash_subpartition [, hash_subpartition, ...] )

hash_subpartition:
	SUBPARTITION subpartition_name [partition_spec_options]

# Tentukan subpartisi RANGE atau RANGE COLUMNS dari partisi level-1.
range_partition_list:
    ( range_partition [, range_partition, ... ] )

range_partition:
    	PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* Tentukan partisi murni level-1 atau subpartisi yang ditemplatkan.*/
    | PARTITION partition_name VALUES LESS THAN (range_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Tentukan subpartisi non-ditemplatkan di bawah partisi level-1.*/
   
# Tentukan subpartisi RANGE atau RANGE COLUMNS dari partisi level-2.
range_subpartition_list:
	( range_subpartition [, range_subpartition, ... ] )

range_subpartition:
    SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]
  
range_bound_value:
	  maxvalue /* Tentukan jumlah maksimum partisi RANGE.*/
	| expr /* Tentukan nilai batas rentang untuk kolom kunci partisi tunggal.*/
	| value_list /* Tentukan nilai batas rentang untuk beberapa kolom kunci partisi.*/

# Tentukan subpartisi LIST atau LIST COLUMNS dari partisi level-1.
list_partition_list:
    (list_partition [, list_partition ...])

list_partition:
    	PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* Tentukan partisi murni level-1 atau subpartisi yang ditemplatkan.*/
    | PARTITION partition_name VALUES IN (list_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Tentukan subpartisi non-ditemplatkan di bawah partisi level-1.*/

# Tentukan subpartisi LIST atau LIST COLUMNS dari partisi level-2.
list_subpartition_list:
	(list_subpartition [, list_subpartition ...])

list_subpartition:
	SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]

list_bound_value:
		default /* Tentukan partisi LIST default.*/
	|	value_set

value_set:
	  value_list /* Tentukan satu set nilai untuk kolom kunci partisi tunggal.*/
	| (value_list) [, (value_list), ...] /* Tentukan satu set nilai untuk beberapa kolom kunci partisi.*/

value_list:
	value [, value, ...]

partition_spec_options:
	    [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string']
        [LOCALITY [=] locality_option]

table_option:
 	    [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string']
        [{CHARSET | CHARACTER SET} [=] charset]
        [COLLATE [=] collation]
        [TABLEGROUP [=] table_group_id]
        [LOCALITY [=] locality_option]  

locality_option:
    'dn=storage_inst_id_list'
    
storage_inst_id_list:
    storage_inst_id[,storage_inst_id_list]

local_partition_definition:
		LOCAL PARTITION BY RANGE (column_name)
    [STARTWITH 'yyyy-MM-dd']
    INTERVAL interval_count [YEAR|MONTH|DAY]
    [EXPIRE AFTER expire_after_count]
    [PRE ALLOCATE pre_allocate_count]
    [PIVOTDATE pivotdate_func]
    [DISABLE SCHEDULE]
    
pivotdate_func:
		NOW()
  |	DATE_ADD(...)
  | DATE_SUB(...)

Sintaks CREATE GLOBAL INDEX digunakan untuk menambahkan GSI setelah tabel dibuat. Sintaks ini memperkenalkan kata kunci GLOBAL dalam sintaks MySQL untuk menentukan bahwa hanya GSIs yang dapat ditambahkan. Pembuatan GSI setelah tabel dibuat memiliki beberapa batasan. Untuk informasi lebih lanjut tentang batasan GSIs, lihat Buat dan Gunakan GSIs.

Untuk informasi lebih lanjut tentang klausa yang mendefinisikan GSIs, lihat CREATE TABLE (mode DRDS).

Examples

Contoh berikut menjelaskan cara membuat GSI setelah tabel dibuat.

# Buat tabel.
CREATE TABLE t_order (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext DEFAULT NULL,
  `order_detail` longtext DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by hash(`order_id`) partitions 16;
# Buat GSI.
CREATE GLOBAL INDEX `g_i_seller` ON t_order (`seller_id`) COVERING(`order_snapshot`) partition by hash(`seller_id`) partitions 16;
  • Tabel Dasar: Dalam contoh sebelumnya, tabel dasar t_order adalah tabel yang dipartisi. Data dipartisi menggunakan algoritma hash. Kolom order_id ditentukan sebagai kunci partisi hash.

  • Tabel Indeks: Dalam contoh sebelumnya, tabel indeks g_i_seller dipartisi menggunakan algoritma hash. Kolom seller_id ditentukan sebagai kunci partisi hash. Kolom order_snapshot ditentukan sebagai kolom penutup.

  • Klausa yang Mendefinisikan Indeks: CREATE GLOBAL INDEX `g_i_seller` ON t_order (`seller_id`) COVERING(`order_snapshot`) partition by hash(`seller_id`) partitions 16;.

Eksekusi pernyataan SHOW INDEX untuk melihat indeks, seperti indeks lokal pada kolom order_id dan GSIs pada kolom id dan order_id. seller_id juga ditentukan sebagai kunci shard tabel indeks. Selain itu, id dan order_id adalah kolom penutup default. id juga ditentukan sebagai kunci utama, dan order_id adalah kunci shard tabel dasar.

Catatan

Untuk informasi lebih lanjut tentang batasan GSIs, lihat Buat dan Gunakan GSIs. Untuk informasi lebih lanjut tentang SHOW INDEX, lihat SHOW INDEX.

show index from t_order;

Hasil sampel:

+--------------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table              | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t_order_****_00000 |          0 | PRIMARY   |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t_order_****_00000 |          1 | l_i_order |            1 | order_id    | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.02 sec)

Eksekusi pernyataan SHOW GLOBAL INDEX untuk melihat GSIs. Untuk informasi lebih lanjut, lihat SHOW GLOBAL INDEX.

show global index from t_order;
+---------------------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| SCHEMA              | TABLE   | NON_UNIQUE | KEY_NAME   | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT | STATUS |
+---------------------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| ZZY3_DRDS_LOCAL_APP | t_order | 1          | g_i_seller | seller_id   | id, order_id   | NULL       | seller_id        | HASH                | 4                  |                  | NULL                | NULL               | PUBLIC |
+---------------------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+  

Eksekusi pernyataan berikut untuk melihat struktur tabel indeks. Tabel tersebut berisi kunci utama tabel dasar, kunci shard, kolom penutup default, dan kolom penutup kustom. Kolom kunci utama menghapus atribut AUTO_INCREMENT dan indeks lokal tabel dasar.

show create table g_i_seller;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                  |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| g_i_seller | CREATE TABLE `g_i_seller` (
  `id` bigint(11) NOT NULL,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_shard_key_seller_id` (`seller_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by hash(`seller_id`) partitions 16 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+