LindormTable mendukung indeks sekunder dalam model Tabular. Indeks sekunder memungkinkan Anda melakukan kueri data pada kolom non-primary-key tanpa mengubah logika penulisan aplikasi—Lindorm secara otomatis menangani pemeliharaan indeks dan menjamin konsistensi antara tabel utama dan semua tabel indeks.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans Lindorm
Klien SQL yang terhubung ke LindormTable. Lihat Menggunakan Mesin LindormTable dengan SQL Tabel Lebar Lindorm atau Hubungkan dan gunakan LindormTable dengan Lindorm-cli
Konsep utama
Hubungan antara indeks dan tabel utama
Setiap indeks sekunder dipetakan ke tabel data fisik independen yang terpisah dari tabel utama. Anda dapat membuat beberapa indeks untuk satu tabel utama, termasuk indeks gabungan yang dibangun berdasarkan satu atau lebih kolom. Saat Anda menulis ke tabel utama, Lindorm secara otomatis memperbarui semua tabel indeks terkait. Saat melakukan kueri, tentukan kondisi dalam klausa WHERE terhadap tabel utama—Lindorm secara otomatis memilih indeks terbaik, termasuk kembali menggunakan tabel utama jika tidak ada indeks yang sesuai.
Perubahan Skema Online
Modifikasi indeks—menambahkan, menonaktifkan, atau menghapus indeks—tidak memengaruhi operasi baca atau tulis normal pada tabel utama. Anda dapat menambah, menghapus, atau memperbarui indeks kapan saja tanpa downtime.
Konsistensi kuat
Konsistensi data antara tabel utama dan tabel indeks memiliki batasan berikut:
Isolasi snapshot tidak didukung. Data yang ditulis ke tabel utama mungkin tidak langsung terlihat di tabel indeks. Setelah server mengembalikan respons sukses, data menjadi terlihat di keduanya.
Perilaku timeout klien atau error I/O. Jika penulisan gagal karena timeout klien atau error I/O, data mungkin tidak muncul baik di tabel utama maupun tabel indeks. Konsistensi akhir (eventual consistency) antara keduanya tetap dijamin.
Mutabilitas
Setiap penulisan ke tabel yang diindeks lebih mahal daripada penulisan ke tabel biasa karena indeks harus dipelihara. Biaya aktual bergantung pada apakah workload Anda memperbarui atau menghapus baris yang sudah ada.
Properti MUTABILITY memberi tahu Lindorm jenis operasi yang dilakukan oleh workload Anda sehingga dapat meminimalkan overhead pemeliharaan indeks. Atur properti ini menggunakan Table_Options saat membuat atau memodifikasi tabel. Lihat Sintaks CREATE TABLE.
Pilih pengaturan mutabilitas berdasarkan pola penulisan Anda:
Hanya tambah (append-only), tanpa pembaruan atau penghapusan: gunakan
IMMUTABLETambah dan hapus per baris, tanpa pembaruan: gunakan
IMMUTABLE_ROWSPembaruan dan penghapusan, tanpa timestamp kustom: gunakan
MUTABLE_LATEST(direkomendasikan)Pembaruan dan penghapusan dengan timestamp kustom: gunakan
MUTABLE_UDT
Pola workload | Pengaturan | Biaya operasi | Catatan |
Tidak ada indeks | — | 1 | Menulis langsung ke tabel utama |
Hanya insert, tidak pernah update atau delete |
| 2 | Biaya terendah. Tidak direkomendasikan: tidak ada perlindungan yang mencegah pembaruan—jika terjadi pembaruan, indeks diam-diam menjadi tidak konsisten dengan tabel utama |
Insert dan delete berdasarkan baris, tidak pernah update |
| 2–3 | Biaya terendah kedua. Tidak direkomendasikan: peringatan yang sama—pembaruan menyebabkan ketidakkonsistenan diam-diam |
Update dan delete, tanpa timestamp kustom |
| 4 | Default untuk LindormTable 2.7.9 dan versi lebih baru. Keseimbangan terbaik antara keamanan dan kinerja |
Update dan delete, timestamp kustom diperlukan |
| 4 | Versi teroptimalkan dari |
Update dan delete, timestamp kustom, tanpa batasan versi |
| 4 | Tanpa batasan; gunakan |
MUTABLE_LATEST adalah pengaturan yang direkomendasikan. Untuk LindormTable 2.7.9 dan versi lebih baru, ini merupakan nilai default. Jika instans Anda menjalankan versi sebelumnya, atur MUTABILITY='MUTABLE_LATEST' secara eksplisit.
Untuk menulis data dengan timestamp kustom, gunakan MUTABLE_UDT (memerlukan LindormTable 2.6.7 atau versi lebih baru). Rencanakan hal ini sebelum membuat indeks—properti mutabilitas berlaku saat pembuatan indeks.
Jika Anda menulis data dengan timestamp kustom tetapi belum mengatur mutabilitas ke MUTABLE_UDT atau MUTABLE_ALL sebelum membuat indeks, kueri terhadap indeks akan langsung gagal setelah pembuatan indeks. Untuk langkah pemulihan, lihat FAQ.
IMMUTABLEdanIMMUTABLE_ROWStidak memiliki penegakan di sisi server. Jika workload Anda memperbarui data tetapi tabel diatur keIMMUTABLEatauIMMUTABLE_ROWS, server tidak mengembalikan error—tetapi data indeks menjadi tidak konsisten dengan tabel utama. Gunakan pengaturan ini hanya jika Anda yakin tidak akan terjadi pembaruan. Karena tabelIMMUTABLEtidak melibatkan penghapusan, mereka sepenuhnya mendukung penerapan aktif-aktif multi-Internet Data Center (IDC).
Indeks cakupan
Tanpa indeks cakupan, kueri yang cocok dengan entri indeks tetap perlu mengambil seluruh baris dari tabel utama. Kunci baris (rowkeys) yang dikembalikan oleh indeks mungkin tersebar di seluruh tabel utama, memerlukan beberapa panggilan prosedur jarak jauh (RPC) dan meningkatkan waktu respons (RT) seiring pertambahan ukuran set hasil.
Indeks cakupan menyertakan kolom tabel utama secara langsung dalam tabel indeks, sehingga menghilangkan pencarian ke tabel utama untuk kolom-kolom tersebut. Lindorm mendukung tiga mode cakupan:
Specific columns: Daftarkan kolom yang akan direplikasi dari tabel utama.
Semua kolom skema (
COVERED_ALL_COLUMNS_IN_SCHEMA): Menyertakan semua kolom yang saat ini didefinisikan dalam skema tabel utama. Saat kolom baru ditambahkan ke tabel utama, indeks secara otomatis menyertakannya—tidak perlu pengindeksan ulang.Kolom dinamis (
DYNAMIC): Menyertakan semua kolom dinamis dari tabel utama, ditambah semua kolom yang didefinisikan dalam skema.
Timestamp kustom (User-Defined Timestamp, UDT)
Lindorm mendukung timestamp kustom tingkat kolom. Menulis data dengan timestamp kustom umum digunakan dalam sistem berbasis HBase untuk mengontrol Time to Live (TTL) dan menangani penulisan out-of-order atau idempoten. Indeks sekunder di Lindorm juga mendukung pembaruan data indeks saat menggunakan timestamp kustom—kemampuan yang jarang ditemukan dalam sistem NoSQL.
Dua kasus penggunaan penting:
Impor konkuren dan pembaruan real-time: Gunakan waktu saat ini untuk penulisan real-time dan timestamp sebelumnya (misalnya, 23:59:59 hari sebelumnya) untuk impor historis. Penulisan real-time memiliki prioritas lebih tinggi; impor historis hanya mengisi data yang belum diperbarui.
Penangkapan pesan (message catch-up): Saat sistem melewatkan pesan yang terakumulasi dan memproses pesan terbaru terlebih dahulu, setiap pesan membawa timestamp-nya sendiri. Menangkap pesan lama kemudian menerapkan urutan overwrite yang benar, terlepas dari urutan pemrosesan.
Buat indeks sekunder
Setelah membuat tabel utama Lindorm, buat indeks sekunder pada kolom-kolomnya menggunakan pernyataan CREATE INDEX.
Contoh berikut menggunakan tabel orders. Indeks pada kolom user_id memungkinkan Anda melakukan kueri pesanan berdasarkan pengguna tanpa memindai seluruh tabel.
-- Buat tabel utama
CREATE TABLE orders (
order_id VARCHAR NOT NULL,
user_id VARCHAR,
status VARCHAR,
amount DOUBLE,
created BIGINT,
PRIMARY KEY(order_id)
) WITH (CONSISTENCY = 'strong', MUTABILITY = 'MUTABLE_LATEST');
-- Buat indeks cakupan pada user_id, mencakup semua kolom skema
-- Kueri yang difilter berdasarkan user_id akan menggunakan indeks ini dan menghindari pencarian ke tabel utama
CREATE INDEX idx_user ON orders(user_id) WITH (INDEX_COVERED_TYPE = 'COVERED_ALL_COLUMNS_IN_SCHEMA');
-- Kueri ini secara otomatis menggunakan idx_user
SELECT * FROM orders WHERE user_id = 'u123';Pilih pembuatan indeks sinkron atau asinkron berdasarkan ukuran tabel utama Anda. Gunakan pembuatan sinkron untuk tabel kecil dan asinkron untuk tabel besar. Lihat CREATE INDEX untuk detail sintaks.
Saat menambahkan indeks ke tabel yang sudah berisi data, CREATE INDEX menyinkronkan data historis dari tabel utama ke tabel indeks. Proses ini bisa memakan waktu lama untuk tabel besar. Sinkronisasi berjalan di sisi server—menghentikan proses Lindorm Shell tidak mengganggunya.Jika pemisahan data panas dan dingin diaktifkan, pantau Pembatasan kecepatan baca penyimpanan kapasitas selama pembuatan indeks. Pembatasan kecepatan baca penyimpanan dingin mengurangi kecepatan pembuatan indeks dan dapat menyebabkan tekanan balik pada operasi tulis.
Lihat indeks sekunder
Gunakan SHOW INDEX untuk melihat indeks pada tabel, termasuk nama dan statusnya saat ini.
SHOW INDEX FROM orders;Ubah status indeks
Gunakan ALTER INDEX untuk mengaktifkan atau menonaktifkan indeks sekunder.
-- Aktifkan indeks
ALTER INDEX IF EXISTS idx_user ON orders ACTIVE;
-- Nonaktifkan indeks
ALTER INDEX idx_user ON orders DISABLED;Jangan ubah langsung indeks DISABLED menjadi ACTIVE—hal ini menyebabkan kehilangan data. Jalankan operasi BUILD INDEX terlebih dahulu untuk membangun ulang data indeks, lalu aktifkan.
Jika tabel utama berisi data historis setelah pembuatan indeks, jalankan operasi rebuild pada indeks sebelum mengaktifkannya. Lihat BUILD INDEX.
Hapus indeks sekunder
Gunakan DROP INDEX untuk menghapus indeks sekunder dari tabel utama.
DROP INDEX IF EXISTS idx_user ON orders;Menghapus indeks memerlukan izin Trash. Jika kueri aktif sedang menggunakan indeks tersebut, hapus dengan hati-hati.
Pengoptimalan kueri
Lindorm memilih indeks menggunakan Optimasi Berbasis Aturan (Rule Based Optimization/RBO). Sistem ini mencocokkan awalan (prefix) setiap indeks dengan klausa WHERE kueri dan memilih indeks dengan tingkat kecocokan tertinggi.
Contoh berikut menunjukkan cara pengoptimal memilih indeks untuk tabel dengan beberapa indeks:
CREATE TABLE dt (rowkey VARCHAR, c1 VARCHAR, c2 VARCHAR, c3 VARCHAR, c4 VARCHAR, c5 VARCHAR, PRIMARY KEY(rowkey));
CREATE INDEX idx1 ON dt(c1);
CREATE INDEX idx2 ON dt(c2, c3, c4);
CREATE INDEX idx3 ON dt(c3) INCLUDE(c1, c2, c4);
CREATE INDEX idx4 ON dt(c5 DESC) WITH (INDEX_COVERED_TYPE = 'COVERED_ALL_COLUMNS_IN_SCHEMA');Kueri | Indeks yang dipilih | Mengapa |
|
| Kecocokan awalan tepat pada |
|
| Cocok dengan awalan |
|
| Cocok dengan awalan |
|
|
|
Satu kueri hanya dapat menggunakan satu indeks—penggabungan indeks tidak didukung.
Untuk memengaruhi pemilihan indeks, gunakan petunjuk kueri (query hints). Lihat CREATE INDEX.
Batasan
Nama indeks harus unik per tabel utama. Nama indeks yang sama dapat digunakan pada tabel utama berbeda.
Indeks hanya didukung pada tabel versi tunggal. Tabel multi-versi tidak mendukung indeks.
TTL tingkat sel tidak didukung. Tabel indeks mewarisi TTL dari tabel utama; Anda tidak dapat mengatur TTL terpisah untuk tabel indeks.
Untuk LindormTable 2.8.6 dan versi lebih baru: hingga 10 indeks per tabel utama, hingga 8 kolom indeks per indeks. Untuk versi sebelumnya: hingga 5 indeks dan hingga 3 kolom indeks.
Panjang gabungan kolom indeks dan kunci utama tidak boleh melebihi 30 KB. Hindari penggunaan kolom yang lebih besar dari 100 byte sebagai kolom indeks.
Satu kueri hanya menggunakan satu indeks. Kueri penggabungan indeks tidak didukung.
Indeks sekunder tidak mendukung fitur peningkatan batch.
Urutan hasil dari kueri indeks sekunder berbeda dari urutan tabel utama.
Indeks tidak dapat dibangun untuk data yang diimpor melalui Bulkload. Indeks hanya berlaku untuk data yang ditulis melalui SQL atau API.
Membuat indeks pada tabel besar menyebabkan
CREATE INDEXberjalan lama saat data historis disinkronkan.
FAQ
Mengapa muncul error User-Defined-Timestamp(UDT) is not supported by table in MUTABLE_LATEST mode?
Anda membuat indeks saat mutabilitas tabel diatur ke MUTABLE_LATEST, tetapi aplikasi Anda menulis data dengan timestamp kustom. MUTABLE_LATEST tidak mendukung timestamp kustom.
Untuk memperbaikinya:
Hapus indeks pada tabel utama.
Ubah properti mutabilitas menjadi
MUTABLE_UDT.Buat ulang indeks tersebut.
Jika kueri aktif sedang menggunakan indeks tersebut, menghapusnya akan memengaruhi kueri tersebut. Rencanakan dengan matang sebelum melanjutkan.
Untuk masalah terkait indeks lainnya, bergabunglah dengan grup DingTalk Lindorm atau ajukan tiket. Lihat Dukungan teknis.