Indeks parsial hanya mencakup partisi yang Anda tentukan, bukan seluruh tabel partisi. Pendekatan ini menjaga ukuran indeks tetap ringkas—berguna ketika kueri menargetkan partisi tertentu (misalnya, bulan-bulan terbaru atau kelompok penyewa tertentu), sedangkan data lainnya jarang atau tidak pernah diakses.
Kapan Menggunakan Indeks Parsial
Gunakan indeks parsial ketika beban kerja kueri Anda terkonsentrasi pada subset partisi:
Pemisahan data hot/cold: Partisi terbaru menerima trafik kueri tinggi; partisi lama jarang dikueri. Buat indeks hanya untuk partisi terbaru guna mengurangi ukuran indeks dan overhead penulisan pada data dingin.
Kueri spesifik penyewa: Pada tabel multi-penyewa, kueri dibatasi pada kelompok penyewa tertentu. Buat indeks hanya untuk partisi yang relevan agar tidak perlu memelihara indeks penuh untuk seluruh tabel.
Kueri rentang selektif: Laporan yang selalu memfilter berdasarkan rentang partisi tertentu. Indeks parsial pada partisi tersebut lebih kecil dan lebih cepat dipindai dibandingkan indeks global.
Jika kueri secara rutin mencakup semua partisi atau tabel cukup kecil sehingga indeks penuh masih dapat dikelola, maka indeks global mungkin lebih tepat.
Membuat Indeks Parsial Saat Membuat Tabel Partisi
Tambahkan klausa partial_partition_option dalam pernyataan CREATE TABLE untuk mendefinisikan indeks parsial saat pembuatan tabel.
Sintaks
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
[(create_definition,...)]
[table_options]
partition_options
...create_definition adalah:
{
col_name column_definition
| {INDEX | KEY} [index_name] [index_type] (key_part,...)
[index_option] [partial_partition_option]
...
}partial_partition_option adalah:
([PARTITION partition_name0[(SUBPARTITION subpartition_name0[, ...])]][,...]
)Untuk semua parameter lainnya, lihat CREATE TABLE.
Parameter
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel. |
col_name | Nama kolom. |
partition_name0 | Nama partisi. Pisahkan beberapa nama partisi dengan koma (,). |
subpartition_name0 | Nama subpartisi. Pisahkan beberapa nama subpartisi dengan koma (,). |
Contoh
Buat indeks hanya untuk partisi bulan ini
Contoh berikut membuat tabel orders yang dipartisi berdasarkan bulan (RANGE(month(date))) dan mendefinisikan dua indeks parsial:
o_ind_dp(dept_no, part_no)— hanya mencakup partisi Desember (orders_202212), yang menerima penulisan dan kueri bertarget untuk bulan berjalan.o_ind_amout(amount, order_id)— mencakup 11 partisi historis (orders_202201hinggaorders_202211), mendukung pelaporan berbasis jumlah pada data historis.
CREATE TABLE orders
(
order_id INT,
dept_no INT,
part_no INT,
country varchar(20),
date DATE,
amount INT,
Primary Key(order_id),
KEY o_ind_dp(dept_no, part_no) (partition orders_202212),
KEY o_ind_amout(amount, order_id)
(partition orders_202201,
partition orders_202202,
partition orders_202203,
partition orders_202204,
partition orders_202205,
partition orders_202206,
partition orders_202207,
partition orders_202208,
partition orders_202209,
partition orders_202210,
partition orders_202211
)
)
PARTITION BY RANGE(month(date))
(
PARTITION orders_202201 VALUES LESS THAN(2),
PARTITION orders_202202 VALUES LESS THAN(3),
PARTITION orders_202203 VALUES LESS THAN(4),
PARTITION orders_202204 VALUES LESS THAN(5),
PARTITION orders_202205 VALUES LESS THAN(6),
PARTITION orders_202206 VALUES LESS THAN(7),
PARTITION orders_202207 VALUES LESS THAN(8),
PARTITION orders_202208 VALUES LESS THAN(9),
PARTITION orders_202209 VALUES LESS THAN(10),
PARTITION orders_202210 VALUES LESS THAN(11),
PARTITION orders_202211 VALUES LESS THAN(12),
PARTITION orders_202212 VALUES LESS THAN(13)
);Buat indeks pada subpartisi tertentu dalam tabel multi-penyewa
Contoh berikut membuat tabel tenants yang disubpartisi menggunakan LIST-RANGE dan mendefinisikan dua indeks parsial:
ind_id(id)— mencakup semua subpartisi darip0dan subpartisip1_1,p1_2, sertap1_3darip1.ind_date(date)— mencakup subpartisip0_1danp0_2darip0, serta subpartisip1_1danp1_2darip1.
CREATE TABLE tenants (
id INT,
date DATE,
count INT,
KEY ind_id (id) (
partition p0,
partition p1 (subpartition p1_1, subpartition p1_2, subpartition p1_3)
),
KEY ind_date (date) (
partition p0 (subpartition p0_1, subpartition p0_2),
partition p1 (subpartition p1_1, subpartition p1_2)
)
) PARTITION BY LIST COLUMNS(id)
SUBPARTITION BY RANGE (month(date))(
PARTITION p0 VALUES IN (1, 2, 3, 4, 5) (
SUBPARTITION p0_1 VALUES LESS THAN(4),
SUBPARTITION p0_2 VALUES LESS THAN(7),
SUBPARTITION p0_3 VALUES LESS THAN(10),
SUBPARTITION p0_4 VALUES LESS THAN(13)
),
PARTITION p1 VALUES IN (11, 12, 13, 14, 15) (
SUBPARTITION p1_1 VALUES LESS THAN(4),
SUBPARTITION p1_2 VALUES LESS THAN(7),
SUBPARTITION p1_3 VALUES LESS THAN(10),
SUBPARTITION p1_4 VALUES LESS THAN(13)
)
);Membuat Indeks Parsial pada Tabel Partisi yang Sudah Ada
Gunakan CREATE INDEX atau ALTER TABLE ADD KEY untuk menambahkan indeks parsial ke tabel yang sudah ada.
Sintaks
CREATE [UNIQUE] INDEX index_name
[index_type]
ON table_name (key_part,...)
[index_option]
[algorithm_option | lock_option | partial_partition_option] ...partial_partition_option adalah:
([PARTITION partition_name0[(SUBPARTITION subpartition_name0[, ...])]][,...]
)Untuk semua parameter lainnya, lihat CREATE INDEX.
Parameter
| Parameter | Deskripsi |
|---|---|
index_name | Nama indeks. |
table_name | Nama tabel. |
partition_name0 | Nama partisi. Pisahkan beberapa nama partisi dengan koma (,). |
subpartition_name0 | Nama subpartisi. Pisahkan beberapa nama subpartisi dengan koma (,). |
Contoh
Tambahkan indeks parsial ke satu partisi
Contoh berikut menambahkan indeks parsial o_part_id ke partisi orders_202201 pada tabel orders yang sudah ada:
CREATE INDEX o_part_id ON orders(part_no, order_id) (partition orders_202201);Atau, gunakan ALTER TABLE ADD KEY:
ALTER TABLE orders ADD KEY o_part_id(part_no, order_id) (partition orders_202201);Tambahkan indeks parsial yang mencakup beberapa partisi dan subpartisi
Contoh berikut menambahkan indeks parsial ind_count ke semua subpartisi dari p0 dan ke subpartisi p1_1 dari p1 pada tabel tenants yang sudah ada:
CREATE INDEX ind_count ON tenants(count) (partition p0, partition p1 (subpartition p1_1));Atau, gunakan ALTER TABLE ADD KEY:
ALTER TABLE tenants ADD KEY ind_count(count) (partition p0, partition p1 (subpartition p1_1));