Dalam database terdistribusi, kueri yang melakukan filter berdasarkan kolom indeks tetapi mengembalikan kolom non-indeks memerlukan pencarian tabel—yaitu mengambil data dari tabel dasar setelah menemukan entri indeks yang sesuai. Langkah tambahan ini menambahkan I/O jaringan dan meningkatkan latensi kueri.
Clustered index menghilangkan overhead tersebut. Ini merupakan jenis khusus dari global secondary index (GSI) yang mencakup semua kolom dari tabel dasar. Kueri yang dilayani dari clustered index dapat mengambil semua kolom yang diperlukan tanpa memindai tabel dasar, sehingga mengurangi I/O dan latensi kueri.
PolarDB-X secara otomatis mengelola cakupan kolom dan menjaga clustered index tetap sinkron dengan tabel dasar.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans PolarDB-X yang menjalankan kernel versi V5.4.9 atau lebih baru
Cara kerja
Ketika Anda menambahkan kata kunci CLUSTERED ke dalam definisi indeks, PolarDB-X membuat tabel indeks yang mencerminkan semua kolom dari tabel dasar. Pembacaan data langsung diarahkan ke tabel indeks ini, melewati pemindaian tabel dasar. Pembaruan pada kolom apa pun di tabel dasar secara otomatis disebarkan ke clustered index. Indeks lokal pada tabel dasar juga disinkronkan ke tabel clustered index.
Buat clustered index
Tambahkan kata kunci CLUSTERED ke definisi indeks apa pun. PolarDB-X mendukung tiga metode.
Buat tabel dengan clustered index
CREATE [SHADOW] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[drds_partition_options]
create_definition:
[UNIQUE] CLUSTERED INDEX index_name [index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...Jika tabel menggunakan primary key-nya sebagai shard key, hilangkan aturan sharding dari [drds_partition_options].Tambahkan clustered index ke tabel yang sudah ada
Menggunakan CREATE INDEX:
CREATE [UNIQUE]
CLUSTERED INDEX index_name [index_type]
ON tbl_name (index_col_name,...)
[drds_partition_options]
[index_option] ...Jika tabel menggunakan primary key-nya sebagai shard key, hilangkan aturan sharding dari [drds_partition_options].Menggunakan ALTER TABLE:
ALTER TABLE tbl_name
alter_specification
alter_specification:
| ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name
[index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...Saat menggunakan ALTER TABLE:Tentukan hanya satu aturan sharding dalam klausa alter_specification.Selalu berikan nama untuk clustered index.
Jika tabel menggunakan primary key-nya sebagai shard key, hilangkan aturan sharding dari [drds_partition_options].Contoh
Contoh berikut membuat tabel partisi, menambahkan clustered index pada seller_id dan x, lalu memverifikasi hasilnya.
Buat tabel dasar:
CREATE PARTITION TABLE `t_order` (
`t` timestamp null default CURRENT_TIMESTAMP,
`x` int default 3,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL
);Buat clustered index:
CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)Verifikasi skema tabel dasar:
SHOW CREATE TABLE t_order;Output menampilkan baik kunci lokal maupun entri clustered index:
+---------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
LOCAL KEY `_local_c_i` (`seller_id`, `x`),
CLUSTERED INDEX `c_i`(`seller_id`, `x`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)Verifikasi skema clustered index:
SHOW CREATE TABLE c_i;Output mengonfirmasi bahwa clustered index berisi semua kolom dari tabel dasar:
+-------+---------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------+
| c_i | CREATE TABLE `c_i` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
KEY `auto_shard_key_seller_id` USING BTREE (`seller_id`),
KEY `i_seller_id_x` USING BTREE (`seller_id`, `x`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`seller_id`) |
+-------+---------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)Langkah selanjutnya
Untuk daftar lengkap operasi dan batasan yang berlaku untuk clustered index, lihat GSI.