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.
Untuk informasi tentang aturan penamaan versi instans, lihat Catatan Rilis.
Untuk informasi tentang cara melihat versi instans, lihat Lihat dan Perbarui Versi Instans.
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
LENGTHdari 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:
CLUSTERED COLUMNAR: Kata kunci yang menentukan bahwa jenis indeks yang akan ditambahkan adalah CCI.
Tabel utama:
t_orderadalah tabel terpartisi yang menggunakan partisi HASH pada kolomorder_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_idadalah 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
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
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 | |
Algoritma partisi mendukung tipe data yang berbeda. Untuk informasi lebih lanjut, lihat Tipe Data.
Batasan pada pernyataan DDL
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 TABLEALTER 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 TABLEuntuk 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
CatatanSaat 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
CatatanJika Anda ingin mengubah kolom ke tipe data yang tidak didukung, Anda dapat menggunakan pernyataan
DROP INDEXuntuk 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 tabelt_order, Anda dapat menentukanseller_idsebagai kunci pengurutan danorder_idsebagai 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.