Pengindeksan partisi adalah fitur yang dirancang untuk mengatasi tantangan penyimpanan dan akses konkurensi tinggi pada tabel lebar besar. Saat membuat indeks pencarian, Anda dapat menentukan kebijakan partisi data. Server kemudian secara otomatis membagi dan menyimpan data tersebut. Selama kueri, sistem secara otomatis melakukan pemangkasan partisi. Topik ini menjelaskan kebijakan partisi data dan cara menggunakannya.
Prasyarat
Anda telah mengaktifkan fitur indeks pencarian.
Anda telah terhubung ke mesin tabel lebar menggunakan Lindorm-cli.
Skenario
Lindorm search index menyediakan dua kebijakan partisi: partisi hash dan partisi berdasarkan waktu. Pilih kebijakan yang sesuai berdasarkan skenario bisnis berikut.
Partisi hash
Pemangkasan partisi saat kueri: Jika kondisi kueri Anda selalu mencakup kueri kesetaraan pada kolom tertentu, pertimbangkan menggunakan partisi hash pada kolom tersebut. Metode ini memastikan bahwa nilai yang identik selalu diarahkan ke grup partisi yang sama. Selama kueri, pemangkasan partisi memungkinkan pengambilan data hanya dari partisi-partisi yang berisi nilai kueri tersebut. Misalnya, pada tabel perangkat, jika kondisi kueri selalu mencakup ID perangkat, tetapkan kolom ID perangkat sebagai kunci partisi hash.
Penyimpanan partisi yang seimbang: Saat memilih kunci partisi hash, pertimbangkan juga distribusi data. Jika kunci partisi yang dipilih menyebabkan titik panas data (data hot spots), gunakan fitur partisi hash multi-level untuk mendistribusikan data lebih merata ke beberapa partisi.
Partisi berdasarkan waktu
Pemangkasan partisi saat kueri: Jika data bisnis Anda memiliki atribut waktu—seperti data dari Internet of Vehicles (IoV), detail pesanan, atau log pesan—dan kueri Anda sering menggunakan rentang waktu, gunakan partisi berdasarkan waktu. Misalnya, Anda mungkin melakukan kueri data pesanan dari 7 hari terakhir atau bulan lalu. Fitur ini mempersempit cakupan kueri ke shard tertentu berdasarkan rentang waktu yang ditentukan.
Mengontrol batas penyimpanan satu shard: Jika satu indeks atau shard menyimpan volume data yang sangat besar, performa penulisan dan kueri dapat terpengaruh. Jika data indeks Anda tumbuh dengan cepat, gunakan kebijakan partisi berdasarkan waktu untuk mengontrol jumlah data dalam satu shard.
Persiapan
Sebelum menggunakan pengindeksan partisi, buat tabel uji menggunakan pernyataan berikut:
CREATE TABLE IF NOT EXISTS search_table (user_id BIGINT, storeId VARCHAR, goodsId VARCHAR, goodsPrice SMALLINT, orderTime BIGINT, info VARCHAR, PRIMARY KEY (user_id asc));Partisi hash
Lindorm search index mendukung hingga tiga level partisi. Konfigurasi partisi hash tidak dapat diubah setelah dibuat. Contoh berikut menunjukkan sintaks untuk partisi hash.
Partisi primer
Buat indeks pencarian. Secara default, partisi hash didasarkan pada kunci primer tabel lebar. Jumlah partisi default adalah dua kali jumlah node pencarian.
CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice);Buat indeks pencarian dengan partisi hash pada kolom
storeIddan64partisi. KlausulPARTITION BY hash(storeId)menentukanstoreIdsebagai kunci partisi, sedangkan klausulpartitions 64menetapkan jumlah partisi menjadi64.CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice) PARTITION BY hash(storeId) PARTITIONS 64;CatatanSaat menggunakan partisi hash, perkirakan jumlah partisi yang diperlukan berdasarkan volume data. Satu partisi idealnya berisi 50 juta hingga 100 juta catatan dengan ukuran penyimpanan 30 GB hingga 50 GB.
Partisi multi-level
Jika volume total data indeks sangat besar (puluhan miliar catatan atau lebih) dan kunci partisi primer menyebabkan distribusi data yang tidak merata, gunakan partisi multi-level untuk mengoptimalkan distribusi data.
Mesin tabel lebar harus versi 2.8.1 atau lebih baru. Mesin pencarian harus versi 3.9.22 atau lebih baru.
Partisi multi-level tidak dapat digunakan bersamaan dengan partisi berdasarkan waktu.
Buat indeks pencarian dengan partisi hash berdasarkan kolom
storeIddangoodsIddari tabel lebar. Tetapkan faktor salt (salt_factor) untuk kolom-kolom ini masing-masing menjadi2dan4. Klausulpartitions 64menetapkan jumlah total partisi menjadi64.CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice) PARTITION BY hash(storeId(salt_factor=2), goodsId(salt_factor=4)) partitions 64;CatatanFaktor salt partisi (salt_factor) adalah bilangan bulat kecil yang mengontrol tingkat penghashan untuk nilai-nilai kunci partisi yang berbeda. Ikuti langkah-langkah berikut untuk menentukan jumlah total partisi dan faktor salt untuk setiap kunci partisi:
Perkirakan jumlah partisi yang diperlukan berdasarkan volume total data. Kemudian, pilih pangkat dari 2 (
) yang mendekati perkiraan Anda sebagai jumlah total partisi. Misalnya, jika volume total data adalah 2 miliar entri dan setiap partisi berisi sekitar 50 juta entri, Anda memerlukan sekitar 40partisi. Dalam kasus ini, pilihsebagai jumlah total partisi. Jika jumlah total partisi adalah
, jumlah faktor salt untuk semua kunci partisi harus 6. Anda dapat menetapkan faktor salt untuk mengontrol rentang penghashan untuk kunci partisi yang berbeda.Sebagai contoh, jika faktor salt untuk
storeIdadalah2dan faktor salt untukgoodsIdadalah 4, data dengan nilaistoreIdyang sama tetapi nilaigoodsIdyang berbeda akan didistribusikan kedari total partisi. Jika faktor salt untuk storeIdadalah3dan faktor salt untukgoodsIdadalah3, data dengan nilaistoreIdyang sama tetapi nilaigoodsIdyang berbeda akan didistribusikan kedari total partisi.
Buat indeks partisi dengan
_idsebagai kunci partisi sekunder.CatatanJika kunci partisi primer menyebabkan distribusi data yang tidak merata dan tidak tersedia kunci partisi sekunder yang sesuai untuk bisnis Anda, tentukan
_idsebagai kunci partisi sekunder. `_id` berkorespondensi dengan kunci primer komposit dari tabel lebar.CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice) PARTITION BY hash(storeId(salt_factor=2), _id(salt_factor=4)) partitions 64;
Partisi berdasarkan waktu
Untuk data deret waktu, seperti data pesanan atau log pesan, Anda dapat menentukan kolom waktu untuk mempartisi data berdasarkan rentang waktu. Misalnya, Anda dapat mempartisi data berdasarkan minggu atau bulan. Data dalam rentang waktu yang sama disimpan dalam partisi yang sama, dan data dalam partisi lama dapat dihapus secara otomatis berdasarkan kebijakan TTL.
Buat indeks dan partisikan berdasarkan kolom waktu bisnis
orderTime.RANGE_TIME_PARTITION_START='30'menentukan bahwa partisi dibuat mulai dari 30 hari yang lalu.RANGE_TIME_PARTITION_INTERVAL='7'secara otomatis membuat partisi baru setiap 7 hari.RANGE_TIME_PARTITION_TTL='90'menetapkan Time to Live (TTL) default untuk data partisi menjadi 90 hari. Data yang lebih tua dari 90 hari akan dihapus secara otomatis.CREATE INDEX idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice, orderTime) PARTITION BY RANGE time(orderTime) partitions 4 WITH ( indexState=ACTIVE, RANGE_TIME_PARTITION_START='30', RANGE_TIME_PARTITION_INTERVAL='7', RANGE_TIME_PARTITION_TTL='90' );PentingParameter RANGE_TIME_PARTITION_START mengontrol waktu mulai untuk partisi. Parameter ini menentukan jumlah hari sebelum tanggal saat ini dari mana pembuatan partisi dimulai.
Sebagai contoh, asumsikan tanggal paling awal dalam kolom `orderTime` adalah 16 Maret 2021. Untuk menyimpan semua data historis, hitung jumlah hari antara 16 Maret 2021 dan hari saat Anda membuat indeks. Kemudian, tetapkan angka tersebut sebagai nilai parameter RANGE_TIME_PARTITION_START. Setelah waktu mulai ditetapkan, catatan dengan nilai `orderTime` yang lebih awal dari waktu mulai tidak akan diindeks.
Buat indeks yang dipartisi berdasarkan kolom waktu bisnis
orderTime, dengan partisi baru dibuat secara otomatis setiap bulan mulai dari enam bulan yang lalu. Secara default, data disimpan selama enam bulan dan satuan untuk bidang partisi diatur ke detik (s).CREATE INDEX idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice, orderTime) partition by range time(orderTime) partitions 4 with ( indexState=ACTIVE, RANGE_TIME_PARTITION_START='180', RANGE_TIME_PARTITION_INTERVAL='30', RANGE_TIME_PARTITION_TTL='180', RANGE_TIME_PARTITION_FIELD_TIMEUNIT='s' );
Tabel berikut menjelaskan parameter untuk partisi berdasarkan rentang waktu.
Parameter | Wajib | Deskripsi |
RANGE_TIME_PARTITION_START | Ya | Menentukan jumlah hari sebelum pembuatan indeks untuk mulai membuat partisi. Ini berlaku untuk skenario dengan data historis. Jika stempel waktu data historis lebih awal dari waktu mulai partisi, kesalahan akan dilaporkan. |
RANGE_TIME_PARTITION_INTERVAL | Ya | Menentukan interval dalam hari untuk membuat partisi baru. Misalnya, |
RANGE_TIME_PARTITION_TTL | Tidak | Menentukan jumlah hari untuk menyimpan data partisi. Misalnya, |
RANGE_TIME_PARTITION_FIELD_TIMEUNIT | Tidak | Menentukan satuan bidang partisi waktu untuk bisnis Anda. Satuan default adalah milidetik (ms).
|
RANGE_TIME_PARTITION_MAX_OVERLAP | Tidak | Jika data yang sedang ditulis memiliki stempel waktu masa depan, parameter ini menentukan interval maksimum yang diizinkan antara stempel waktu masa depan dan waktu saat ini, dalam satuan hari. Jika tidak ditentukan, tidak ada batasan. |
RANGE_TIME_PARTITION_FORMAT | Tidak | Menentukan format penulisan bidang partisi waktu untuk bisnis Anda. Nilai default adalah |