All Products
Search
Document Center

PolarDB:CREATE INDEX

Last Updated:Mar 29, 2026

Gunakan CREATE INDEX untuk menambahkan indeks sekunder lokal (LSI) atau indeks sekunder global (GSI) ke tabel yang sudah ada di PolarDB-X 1.0.

LSI

Sintaksis LSI mengikuti pernyataan standar MySQL CREATE INDEX. Untuk referensi sintaksis lengkap, lihat MySQL CREATE INDEX.

GSI

GSI mencakup semua shard database dan memungkinkan kueri melakukan filter pada kolom non-shard-key tanpa melakukan pemindaian setiap shard. Gunakan GSI ketika kueri harus melakukan filter berdasarkan kolom selain kunci shard dari tabel utama.

Sintaksis

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] ...

-- Opsi khusus GSI
global_secondary_index_option:
    [COVERING (col_name, ...)]
    drds_partition_options

-- Opsi sharding untuk tabel indeks
drds_partition_options:
    DBPARTITION BY db_sharding_algorithm
    [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 | 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)

-- Parameter length hanya berlaku saat membuat LSI pada kunci shard dari tabel indeks
index_sharding_col_name:
    col_name [(length)] [ASC | DESC]

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'

index_type:
    USING {BTREE | HASH}

algorithm_option:
    ALGORITHM [=] {DEFAULT | INPLACE | COPY}

lock_option:
    LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

Parameter

ParameterDeskripsi
UNIQUEMemberlakukan kendala unik global di seluruh shard. PolarDB-X secara otomatis membuat indeks unik lokal pada tabel indeks yang mencakup semua kolom indeks GSI untuk mempertahankan kendala ini.
GLOBALKata kunci wajib yang menetapkan indeks sebagai GSI. Tanpa GLOBAL, CREATE INDEX akan membuat indeks lokal standar MySQL.
index_nameNama indeks. Harus unik dalam tabel tersebut.
index_sharding_col_nameKolom kunci shard untuk tabel indeks. Menentukan bagaimana data dalam tabel indeks didistribusikan ke seluruh shard.
COVERING (col_name, ...)Kolom tambahan yang disimpan dalam tabel indeks. Ketika kueri melakukan filter berdasarkan kunci shard GSI dan hanya memilih kolom yang dicakup (covered), PolarDB-X membaca langsung dari tabel indeks tanpa melakukan join kembali ke tabel utama. Tanpa klausa ini, hanya kunci primer dan kunci shard tabel utama yang disimpan sebagai kolom covered bawaan, sehingga kueri yang memilih kolom lain memerlukan join kembali ke tabel utama.
DBPARTITION BYWajib. Menentukan algoritma sharding tingkat database untuk tabel indeks.
TBPARTITION BYOpsional. Menentukan algoritma sharding tingkat tabel dan jumlah shard tabel (TBPARTITIONS).

Prasyarat

Catatan: Untuk menjalankan ALTER TABLE pada tabel yang berisi GSI, versi MySQL harus 5.7 atau lebih baru dan versi PolarDB-X 1.0 harus V5.4.1 atau lebih baru.

Untuk daftar lengkap batasan GSI, lihat Catatan penggunaan GSI.

Untuk detail tentang klausa yang digunakan untuk mendefinisikan GSI, lihat CREATE TABLE.

Contoh: membuat GSI setelah pembuatan tabel

Contoh berikut membuat GSI pada kolom buyer_id dari tabel t_order yang sudah ada dan di-shard berdasarkan order_id.

Langkah 1: Buat tabel utama.

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 dbpartition by hash(`order_id`);

Tabel utama t_order dipartisi ke dalam shard database menggunakan sharding hash pada order_id. Tidak ada shard tabel.

Langkah 2: Tambahkan GSI.

ALTER TABLE t_order
  ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`)
  COVERING (`order_snapshot`)
  dbpartition by hash(`buyer_id`);

Ini membuat GSI unik bernama g_i_buyer pada buyer_id. Tabel indeks di-shard berdasarkan buyer_id. Karena order_snapshot ditentukan sebagai kolom covering, kueri yang melakukan filter berdasarkan buyer_id dan memilih order_snapshot membaca langsung dari tabel indeks tanpa melakukan join kembali ke t_order. Kolom covering bawaan id (kunci primer) dan order_id (kunci shard tabel utama) ditambahkan secara otomatis.

Langkah 3: Verifikasi indeks.

Jalankan SHOW INDEX untuk melihat semua indeks, termasuk LSI pada order_id dan GSI pada buyer_id:

mysql> SHOW INDEX FROM t_order;
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| TABLE   | 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  | GLOBAL     | INDEX    |               |
| t_order |          1 | g_i_buyer |            2 | id             | NULL      |           0 |     NULL | NULL   |      | GLOBAL     | COVERING |               |
| t_order |          1 | g_i_buyer |            3 | order_id       | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
| t_order |          1 | g_i_buyer |            4 | order_snapshot | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+

Output menunjukkan g_i_buyer dengan INDEX_TYPE bernilai GLOBAL untuk kolom indeks (buyer_id) dan GLOBAL COVERING untuk kolom covering (id, order_id, dan order_snapshot).

Jalankan SHOW GLOBAL INDEX untuk melihat hanya detail khusus GSI, termasuk kebijakan sharding dan status:

mysql> 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 | 0          | g_i_buyer | buyer_id    | id, order_id, order_snapshot | NULL       | buyer_id         | HASH                | 4                  |                  | NULL                | NULL               | PUBLIC |
+---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+

Jalankan SHOW CREATE TABLE pada tabel indeks untuk memeriksa skemanya:

mysql> SHOW CREATE TABLE g_i_buyer;
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                                                                                                                 |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| g_i_buyer | CREATE TABLE `g_i_buyer` (
  `id` bigint(11) NOT NULL,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext,
  PRIMARY KEY (`id`),
  UNIQUE KEY `auto_shard_key_buyer_id` (`buyer_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`buyer_id`) |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Tabel indeks berisi kunci primer dari tabel utama, kunci shard database dan kunci shard tabel, kolom covering bawaan, serta kolom covering kustom. Tabel ini berbeda dari tabel utama dalam hal-hal berikut:

  • AUTO_INCREMENT dihapus dari kolom kunci primer (id).

  • LSI (l_i_order) dari tabel utama tidak ada.

  • Indeks unik lokal (auto_shard_key_buyer_id) dibuat secara otomatis pada buyer_id untuk memberlakukan kendala unik global.

Lanjutan