全部产品
Search
文档中心

PolarDB:Buat dan gunakan CCI

更新时间:Aug 09, 2025

Topik ini menjelaskan cara membuat dan menggunakan fitur indeks kolom terkluster (CCI) di PolarDB-X untuk mempercepat kueri analitik pada data Anda.

Prasyarat

Instans Anda harus memenuhi persyaratan berikut untuk menggunakan fitur CCI:

  • Edisi instans: Edisi Perusahaan dengan mode database AUTO.

  • Versi instans: 5.4.19-16989811 atau lebih tinggi.

Catatan

Peringatan

  • Kendala berikut berlaku saat Anda membuat CCI:

    • Indeks awalan tidak dapat digunakan.

    • Anda harus menentukan nama indeks saat membuat CCI.

    • Secara default, CCI mencakup semua kolom tabel utama. Setelah CCI dibuat, secara otomatis disesuaikan berdasarkan perubahan kolom dalam tabel utama. Anda tidak dapat menyesuaikan kolom secara manual.

    • Membuat CCI tidak membuat indeks lokal tambahan.

    • Dalam definisi indeks, parameter LENGTH dari kunci pengurutan diabaikan.

  • Instans utama, instansi hanya baca, dan instansi kolom baca-saja mendukung perintah kueri seperti SHOW INDEX. Untuk informasi lebih lanjut, lihat SHOW COLUMNAR INDEX, SHOW COLUMNAR OFFSET, dan SHOW COLUMNAR STATUS.

  • Untuk informasi lebih lanjut tentang batasan terkait DDL, lihat Batasan.

Sintaksis

PolarDB-X memperluas sintaksis Pernyataan Bahasa Definisi Data (DDL) di MySQL. Sintaksis berikut ditambahkan untuk mendefinisikan CCI. Anda dapat menggunakan sintaksis ini dengan cara yang sama seperti membuat indeks di MySQL.

CREATE
    CLUSTERED COLUMNAR INDEX index_name    
    ON tbl_name (index_sort_key_name,...)    
    [partition_options]

# Tentukan kebijakan partisi
partition_options:
    PARTITION BY
          HASH({column_name | partition_func(column_name)})
        | KEY(column_list)
        | RANGE({column_name | partition_func(column_name)})
      	| RANGE COLUMNS(column_list)
        | LIST({column_name | partition_func(column_name)}) 
        | LIST COLUMNS(column_list)} }
    partition_list_spec

# Tentukan fungsi partisi
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH

# Tentukan daftar partisi
partition_list_spec:
    hash_partition_list
  | range_partition_list
  | list_partition_list

# Tentukan kolom untuk tabel terpartisi HASH/KEY
hash_partition_list:
    PARTITIONS partition_count

# Tentukan kolom untuk tabel terpartisi RANGE/RANGE COLUMNS
range_partition_list:
    range_partition [, range_partition ...]

range_partition:
    PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]
    
# Tentukan kolom untuk tabel terpartisi LIST/LIST COLUMNS
list_partition_list:
    list_partition [, list_partition ...]

list_partition:
    PARTITION partition_name VALUES IN (value_list) [partition_spec_options]

Contoh

Jalankan pernyataan berikut untuk membuat tabel bernama t_order, dan CCI bernama cc_i_seller pada tabel t_order:

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;
CREATE CLUSTERED COLUMNAR INDEX `cc_i_seller` ON t_order (`seller_id`) partition by hash(`order_id`) partitions 16;

Berikut adalah deskripsi kode pembuatan CCI secara detail:

Catatan
  • CLUSTERED COLUMNAR: Kata kunci yang menentukan bahwa jenis indeks yang akan ditambahkan adalah CCI.

  • Tabel utama: t_order adalah tabel terpartisi yang menggunakan partisi HASH pada kolom order_id.

  • Nama indeks: Nama indeks, yang digunakan untuk menentukan indeks dalam pernyataan SQL.

  • Kunci pengurutan: Kunci pengurutan indeks. Data dalam file indeks disimpan berdasarkan urutan kolom ini.

  • Klausa partisi indeks: Algoritma partisi untuk indeks. Sintaksis klausa ini sama dengan sintaksis klausa partisi dalam pernyataan CREATE TABLE. Dalam klausa ini, order_id adalah kolom hash.

  • Klausa definisi indeks: CLUSTERED COLUMNAR INDEX `cc_i_seller` ON t_order (`seller_id`) partition by hash(`order_id`) partitions 16.

Cara menggunakan CCI dalam kueri

Setelah Anda membuat CCI, Anda dapat menentukan tabel indeks untuk digunakan dalam kueri dengan cara berikut:

Tentukan indeks menggunakan petunjuk

Sintaksis:

FORCE INDEX({index_name})

Contoh:

SELECT a.*, b.order_id 
 FROM t_seller a 
   JOIN t_order b FORCE INDEX(cc_i_seller) ON a.seller_id = b.seller_id 
 WHERE a.seller_nick="abc";

Metode pemilihan indeks

Catatan

Untuk kueri pada tabel utama yang berisi CCI, PolarDB-X secara otomatis memilih tabel indeks yang menurut pengoptimal memiliki biaya terendah. Saat ini, hanya instansi kolom baca-saja yang mendukung kueri berbasis CCI.

Jangan gunakan indeks tertentu (IGNORE INDEX)

Sintaksis:

IGNORE INDEX({index_name},...)

Pernyataan berikut menentukan bahwa pengoptimal tidak menggunakan indeks cc_i_seller:

SELECT t_order.id,t_order.order_snapshot FROM t_order IGNORE INDEX(cc_i_seller) WHERE t_order.seller_id = 's1';

Gunakan indeks tertentu (USE INDEX)

Sintaksis:

USE INDEX({index_name},...)

Pernyataan berikut menentukan bahwa pengoptimal menggunakan indeks cc_i_seller:

SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(cc_i_seller) WHERE t_order.seller_id = 's1';

Batasan

Catatan

Batasan diklasifikasikan menjadi tiga jenis berikut:

  • Saat Anda membuat CCI, tipe data kunci utama, kunci pengurutan, dan kunci partisi tunduk pada batasan tertentu.

  • Saat Anda mengeksekusi pernyataan DDL pada tabel yang berisi CCI, batasan tertentu berlaku. Saat ini, hanya pernyataan DDL umum yang didukung.

  • Saat Anda mengeksekusi pernyataan DDL untuk mengubah tipe data kolom, hanya sejumlah tipe data terbatas yang didukung.

Tipe data yang didukung

Tabel berikut menunjukkan tipe data yang didukung untuk kunci utama tabel utama, serta kunci pengurutan dan kunci partisi CCI:

Tipe data

Kunci utama

Kunci pengurutan

Kunci partisi

Tipe numerik

BIT (UNSIGNED)

Didukung

Didukung

Tidak didukung

TINYINT (UNSIGNED)

Didukung

Didukung

Didukung

SMALLINT (UNSIGNED)

Didukung

Didukung

Didukung

MEDIUMINT (UNSIGNED)

Didukung

Didukung

Didukung

INT (UNSIGNED)

Didukung

Didukung

Didukung

BIGINT (UNSIGNED)

Didukung

Didukung

Didukung

Tipe waktu

DATE

Didukung

Didukung

Didukung

DATETIME

Didukung

Didukung

Didukung

TIMESTAMP

Didukung

Didukung

Didukung

TIME

Didukung

Didukung

Tidak didukung

YEAR

Didukung

Didukung

Tidak didukung

Tipe string

CHAR

Didukung

Didukung

Didukung

VARCHAR

Didukung

Didukung

Didukung

TEXT

Didukung

Didukung

Tidak didukung

BINARY

Didukung

Didukung

Didukung

VARBINARY

Didukung

Didukung

Didukung

BLOB

Didukung

Didukung

Tidak didukung

Tipe angka floating-point

FLOAT

Tidak didukung

Tidak didukung

Tidak didukung

DOUBLE

Tidak didukung

Tidak didukung

Tidak didukung

DECIMAL

Tidak didukung

Tidak didukung

Tidak didukung

NUMERIC

Tidak didukung

Tidak didukung

Tidak didukung

Tipe khusus

JSON

Tidak didukung

Tidak didukung

Tidak didukung

ENUM

Tidak didukung

Tidak didukung

Tidak didukung

SET

Tidak didukung

Tidak didukung

Tidak didukung

POINT

Tidak didukung

Tidak didukung

Tidak didukung

GEOMETRY

Tidak didukung

Tidak didukung

Tidak didukung

Catatan

Algoritma partisi mendukung tipe data yang berbeda. Untuk informasi lebih lanjut, lihat Tipe Data.

Batasan pada pernyataan DDL

Catatan

Anda dapat mengontrol apakah pernyataan DDL diizinkan untuk dieksekusi pada tabel dengan CCI (true: diizinkan, false: tidak diizinkan) menggunakan pernyataan berikut:

SET [GLOBAL] forbid_ddl_with_cci = [true | false];
  • Tabel berikut menjelaskan dukungan DDL untuk tabel utama yang berisi CCI dan untuk CCI.

    Kategori

    Aksi

    Contoh SQL

    Didukung

    Tabel utama

    Hapus tabel

    DROP TABLE tbl_name;

    Ya

    Kosongkan tabel

    TRUNCATE TABLE tbl_name;

    Ya

    Ganti nama tabel

    • ALTER TABLE old_tbl_name RENAME TO new_tbl_name;

    • RENAME TABLE old_tbl_name TO new_tbl_name;

    Ya

    Ganti nama beberapa tabel

    RENAME TABLE tbl_name_a to tbl_name_b, tbl_name_c to tbl_name_d;

    Ya

    Tambah kolom

    ALTER TABLE tbl_name ADD col_name TYPE;

    Ya

    Hapus kolom

    ALTER TABLE tbl_name DROP COLUMN col_name;

    Ya

    Ubah tipe kolom

    ALTER TABLE tbl_name MODIFY col_name TYPE;

    Ya

    Ganti nama (ubah) kolom

    ALTER TABLE tbl_name CHANGE old_col new_col TYPE;

    Ya

    Ubah nilai default kolom

    • ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT default_value;

    • ALTER TABLE tbl_name ALTER COLUMN col_name DROP DEFAULT;

    Ya

    Perubahan tipe kolom tanpa kunci

    ALTER TABLE tbl_name MODIFY col_name TYPE, ALGORITHM = omc;

    Ya

    Beberapa operasi ALTER TABLE

    ALTER TABLE tbl_name MODIFY col_name_a, DROP COLUMN col_name_b;

    Ya

    Kolom yang dibuat

    -

    Tidak

    Perubahan partisi

    -

    Tidak

    CCI

    Buat CCI

    • CREATE CLUSTERED COLUMNAR INDEX cci_name;

    • ALTER TABLE tbl_name ADD CLUSTERED COLUMNAR INDEX cci_name;

    Ya

    Hapus CCI

    • DROP INDEX cci_name ON TABLE tbl_name;

    • ALTER TABLE tbl_name DROP INDEX cci_name;

    Ya

    Ubah nama CCI

    ALTER TABLE tbl_name RENAME INDEX cci_name_a TO cci_name_b;

    Ya

    Tambah partisi RANGE ke CCI

    ALTER TABLE `tbl_name`.`cci_name` ADD PARTITION;

    Ya

    Perubahan partisi CCI lainnya

    -

    Tidak

  • Kendala berikut berlaku saat Anda menggunakan ALTER TABLE untuk mengubah kolom:

    Pernyataan

    Apakah kunci utama dapat diubah?

    Apakah kunci partisi indeks dapat diubah?

    Apakah kunci pengurutan dapat diubah?

    MODIFY COLUMN

    Ya

    Ya

    Ya

    ALTER COLUMN SET DEFAULT, ALTER COLUMN DROP DEFAULT

    Ya

    Ya

    Ya

    ADD COLUMN

    Tidak

    N/A

    N/A

    CHANGE COLUMN

    Tidak

    Tidak

    Tidak

    DROP COLUMN

    Tidak

    Tidak

    Tidak

    Catatan
    • Saat ini, Anda dapat mengeksekusi pernyataan ALTER TABLE terkait perubahan kolom pada tabel yang berisi CCI.

    • Pada versi 5.4.20-20250714 dan seterusnya, MODIFY COLUMN dan mengubah nilai default kolom didukung untuk memodifikasi beberapa kunci utama, kunci partisi CCI, dan kunci pengurutan CCI.

    • Mengubah kolom kritis (kunci utama, kunci partisi CCI, atau kunci pengurutan CCI) dapat memicu pembangunan ulang penuh CCI. Ini bisa menjadi operasi jangka panjang pada tabel besar. Fitur ini dinonaktifkan secara default. Kami merekomendasikan agar Anda menggunakan eksekusi asinkron. Untuk menggunakan fitur ini, atur parameter berikut:

      # Izinkan mengubah kolom kritis CCI
      SET ENABLE_MODIFY_CCI_CRITICAL_COLUMN = TRUE;
      # Logika pembangunan ulang untuk kolom kritis. 0 menunjukkan bahwa sistem secara otomatis memilih logika berdasarkan kebijakan. Kami merekomendasikan agar Anda tidak mengubah nilai ini.
      SET REBUILD_CCI_STRATEGY = 0;
      # Jumlah maksimum CCI yang diizinkan dalam sebuah tabel. Jika beberapa CCI sudah ada dalam tabel, Anda dapat mengatur nilai ini ke angka yang lebih besar.
      SET MAX_CCI_COUNT = 2;
  • Tabel berikut menjelaskan tipe data yang didukung untuk pernyataan MODIFY/CHANGE COLUMN:

    Tipe yang didukung

    Tipe yang tidak didukung

    • Tipe numerik: BIT (UNSIGNED), TINYINT (UNSIGNED), SMALLINT (UNSIGNED), MEDIUMINT (UNSIGNED), INT (UNSIGNED), dan BIGINT (UNSIGNED)

    • Tipe waktu: DATETIME, TIMESTAMP, TIME, dan YEAR

    • Tipe angka floating-point: FLOAT, DOUBLE, DECIMAL, dan NUMERIC

    • Tipe string: CHAR, VARCHAR, TEXT, BINARY, VARBINARY, dan BLOB

    • Tipe khusus: JSON, ENUM, dan SET

    Tipe khusus: POINT dan GEOMETRY

    Catatan

    Jika Anda ingin mengubah kolom ke tipe data yang tidak didukung, Anda dapat menggunakan pernyataan DROP INDEX untuk menghapus CCI, mengubah tipe data kolom, dan kemudian membuat ulang CCI.

  • Tabel berikut menjelaskan dukungan untuk mengubah indeks menggunakan pernyataan ALTER TABLE:

    Pernyataan

    Didukung

    ALTER TABLE ADD PRIMARY KEY

    Ya

    ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY

    Ya

    ALTER TABLE DROP INDEX

    Ya

    ALTER TABLE DROP FOREIGN KEY fk_symbol

    Ya

    ALTER TABLE DROP PRIMARY KEY

    Tidak. Dilarang

    ALTER TABLE RENAME INDEX

    Ya. Anda dapat mengubah nama CCI.

    ALTER TABLE ALTER INDEX index_name {VISIBLE | INVISIBLE}

    Tidak. Anda tidak dapat memodifikasi CCI.

    ALTER TABLE {DISABLE | ENABLE} KEYS

    Tidak. Anda tidak dapat memodifikasi CCI.

FAQ

  • Apakah saya bisa membuat CCI tanpa menentukan kunci pengurutan?

    A: Tidak. Anda harus secara eksplisit menentukan kunci pengurutan dalam pernyataan CREATE CLUSTERED COLUMNAR INDEX. Kunci pengurutan dan kunci partisi bisa berupa kolom yang berbeda. Misalnya, saat Anda membuat CCI pada tabel t_order, Anda dapat menentukan seller_id sebagai kunci pengurutan dan order_id sebagai kunci partisi.

  • Apakah saya bisa membuat CCI tanpa menentukan kunci partisi?

    A: Ya. Jika Anda tidak menentukan kunci partisi, kunci utama digunakan sebagai kunci partisi secara default, dan HASH dipilih sebagai kebijakan partisi.

  • Bagaimana cara melihat kemajuan pembuatan CCI?

    A: Anda dapat menggunakan pernyataan manajemen DDL untuk melihat status saat ini dari CCI dan kemajuan eksekusi tugas DDL. Untuk informasi lebih lanjut, lihat SHOW COLUMNAR INDEX dan SHOW DDL.

  • Bagaimana cara menghapus CCI?

    A: Anda dapat menggunakan pernyataan DROP INDEX untuk menghapus CCI.