CREATE INDEX membuat indeks pada satu atau beberapa kolom tabel lebar LindormTable untuk mengaktifkan pencarian berdasarkan kunci non-primary-key, pencarian teks penuh, dan kueri analitik tanpa melakukan pemindaian seluruh tabel.
Cakupan
CREATE INDEX hanya berlaku untuk LindormTable. Tidak ada versi minimum yang diperlukan untuk secondary index.
Untuk membuat search index atau columnstore index menggunakan CREATE INDEX, gunakan Lindorm SQL V2.6.1 atau yang lebih baru. Untuk memeriksa versi Lindorm SQL Anda, lihat panduan versi SQL.
Sebelum memulai
Pembuatan indeks untuk secondary index, columnstore index, dan search index memerlukan lookup data, yang menghasilkan operasi baca. Jika Anda telah mengaktifkan pemisahan data panas dan dingin untuk instans Anda, pantau Pembatasan kecepatan baca penyimpanan kapasitas pada cold storage. Pembacaan yang dibatasi pada cold storage memperlambat pembuatan indeks dan dapat menyebabkan tekanan balik pada operasi tulis.
Sintaks
CREATE INDEX [IF NOT EXISTS] [index_identifier]
[USING {KV | SEARCH | COLUMNAR}]
ON table_identifier '(' index_key_expression ')'
[INCLUDE '(' column_identifier (, column_identifier)* ')']
[PARTITION BY partition_definition]
[{ASYNC | SYNC}]
[WITH '(' index_options ')']Sub-produksi:
index_key_expression ::= index_key_definition (, index_key_definition)*
| wildcard_string_literal
index_key_definition ::= column_identifier [DESC]
| column_identifier '(' option_definition (, option_definition)* ')'
| function_expression
function_expression ::= Z-ORDER '(' column_identifier (, column_identifier)* ')'
| S2 '(' column_identifier, level ')'
| CAST '(' column_identifier AS type ')'
| MD5 '(' column_identifier ')'
| SHA256 '(' column_identifier ')'
partition_definition ::= {RANGE TIME} '(' column_identifier ')' [PARTITIONS number_literal]
| HASH '(' column_identifier (, column_identifier)* ')' [PARTITIONS number_literal]
| ENUMERABLE '(' column_identifier (, column_identifier)* ')'
index_options ::= option_definition (, option_definition)*
option_definition ::= option_identifier = string_literalPerbedaan
Elemen sintaks yang didukung bervariasi tergantung jenis indeks.
Elemen sintaks | Secondary index | Search index |
✔ | 0 | |
✔ | 0 | |
0 | ✖ | |
✖ | 0 | |
Mode pembuatan indeks (ASYNC|SYNC) Penting Hanya LindormTable 2.6.3 dan yang lebih baru yang mendukung mode pembuatan | 0 | 0 |
0 | 0 |
Elemen sintaks | Secondary index | Search index |
| Opsi (KV adalah nilai default) | Opsional |
Ekspresi kunci indeks | Wajib | Wajib |
| Opsional | Tidak didukung |
| Tidak didukung | Opsi |
| Opsional | Opsional |
| Opsional | Opsi |
Catatan penggunaan
Anda dapat membuat maksimal 3 secondary index dan 1 search index per tabel lebar.
Tipe indeks (USING)
Gunakan kata kunci USING untuk menentukan tipe indeks. Jika dihilangkan, secondary index (KV) akan dibuat secara default.
| Index type | Use when |
| Secondary index | Pencarian kesetaraan dan rentang berdasarkan kolom non-primary-key. Sebuah instans mendukung paling banyak 8 tugas pembuatan secondary index secara bersamaan; permintaan kesembilan akan langsung gagal. |
| Search index | Pencarian teks penuh, kueri fuzzy, pemfilteran multi-dimensi, agregasi, serta pengurutan dengan pagination. Tidak ada batasan jumlah tugas pembuatan yang dapat dijalankan secara bersamaan. Fitur indeks pencarian harus diaktifkan terlebih dahulu — node pencarian dan node Lindorm Tunnel Service (LTS) dikenai biaya. Lihat Aktifkan indeks pencarian. Kunci indeks harus mencakup setidaknya satu kolom non-primary-key. Tipe data yang didukung: semua tipe dasar kecuali DATE, TIME, dan DECIMAL. Lihat Tipe data dasar. |
Ekspresi kunci indeks (index_key_expression)
Tentukan satu atau beberapa kolom sebagai kunci indeks. Indeks dengan beberapa kunci indeks disebut indeks komposit.
Definisi kunci indeks (index_key_definition)
Untuk secondary index, setiap definisi kunci dapat berupa:
Nama kolom, opsional dengan
DESCuntuk urutan menurunEkspresi fungsi (Z-ORDER, S2, CAST, MD5, atau SHA256)
Untuk indeks pencarian, setiap definisi kunci dapat berupa:
Nama kolom dengan properti kunci indeks opsional
Konstanta wildcard
*untuk mengindeks semua kolom yang ada
Properti kunci search index (option_definition)
Tentukan properti per kolom menggunakan sintaks column(property=value, ...). Contoh: c3(type=text, analyzer=ik). Anda juga dapat menentukan properti ini saat menambahkan kolom indeks menggunakan pernyataan ALTER INDEX.
Properti | Tipe | Deskripsi |
| STRING | Menentukan apakah akan membuat indeks untuk kolom ini. Indeks terbalik dibuat untuk kolom string; indeks numerik BKD-Tree untuk kolom numerik. Nilai valid: |
| STRING | Menentukan apakah akan menyimpan nilai mentah kolom. Nilai valid: |
| STRING | Menentukan apakah akan menggunakan penyimpanan kolom untuk mempercepat pengurutan dan analisis. Nilai valid: |
| STRING | Atur ke |
| STRING | Tokenizer untuk kolom |
| STRING | Properti kunci indeks kustom dalam bentuk string JSON, kompatibel dengan sintaks pemetaan Elasticsearch. Hanya berlaku untuk versi yang kompatibel dengan Elasticsearch. Menggantikan semua properti lain untuk kunci ini |
Ekspresi fungsi secondary index (function_expression)
Saat membuat secondary index, Anda dapat menentukan ekspresi fungsi sebagai kunci indeks.
Ekspresi fungsi MD5 dan SHA256 memerlukan LindormTable 2.6.7.5 atau yang lebih baru. Jika Anda tidak dapat melakukan upgrade, hubungi dukungan teknis Lindorm di DingTalk di s0s3eg3.
Fungsi | Sintaks | Gunakan saat |
Z-ORDER |
| Indeks sekunder spatio-temporal; kolom harus bertipe data spatio-temporal. Lihat Indeks spatio-temporal |
S2 |
| Indeks grid S2 untuk kolom POLYGON atau MULTIPOLYGON; |
CAST |
| Indeks pada hasil konversi tipe data. Lihat Tipe data dasar |
MD5 |
| Indeks pada nilai VARCHAR yang dikodekan MD5. Memerlukan LindormTable 2.6.7.5+. Lihat Fungsi MD5 |
SHA256 |
| Indeks pada nilai VARCHAR yang dikodekan SHA256. Memerlukan LindormTable 2.6.7.5+. Lihat Fungsi SHA256 |
Konstanta wildcard (wildcard_string_literal)
Hanya search index yang mendukung konstanta wildcard *. Gunakan * untuk membuat indeks pada semua kolom yang ada saat pernyataan dijalankan.
CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*);Kolom yang ditambahkan setelah pernyataan dijalankan tidak diindeks secara otomatis. Tambahkan secara manual menggunakan
ALTER INDEX.Kolom dinamis tidak disertakan. Lihat Kolom dinamis.
Kolom yang disertakan (INCLUDE)
Klausa INCLUDE menambahkan kolom non-kunci dari tabel utama ke tabel indeks, membentuk indeks cakupan. Kueri yang mengenai indeks dapat mengambil nilai kolom yang disertakan tanpa melakukan lookup ke tabel utama, sehingga meningkatkan performa baca.
Untuk secondary index, gunakan kata kunciWITHuntuk menyertakan kolom dinamis dengan mengaturINDEX_COVERED_TYPE. Lihat Secondary index.
Partisi indeks (PARTITION BY)
Hanya search index yang mendukung partisi indeks. Server membagi dan menyimpan data secara otomatis. Saat kueri dijalankan, sistem menerapkan pemangkasan partisi untuk melewati partisi yang tidak relevan.
Jenis partisi yang didukung: RANGE dan HASH. Lihat Indeks terpartisi.
Mode pembuatan indeks (ASYNC | SYNC)
Tentukan ASYNC atau SYNC untuk mengontrol kapan pernyataan mengembalikan respons.
Mode | Perilaku | Blok pernyataan? | Indeks dapat digunakan segera setelah pernyataan mengembalikan respons? | Gunakan saat |
| Mengembalikan respons segera setelah tugas pembuatan dimulai | Tidak | Tidak — pembuatan berlanjut di latar belakang | Produksi; proses tulis tetap berjalan tanpa terganggu selama indeks dibuat |
| Mengembalikan respons hanya setelah tugas pembuatan selesai | Ya | Ya | Skrip migrasi skema; pengujian; kasus di mana indeks harus siap sebelum langkah berikutnya |
SYNC memerlukan LindormTable 2.6.3 atau yang lebih baru.
Tabel berikut menunjukkan mode yang didukung oleh masing-masing tipe indeks.duasecondary index dan search indexdua
Building mode | Secondary index | Search index |
| Didukung | Didukung |
| Didukung | Didukung |
Mode pembuatan indeks | Secondary index | Search index |
ASYNC Penting Mulai dari LindormTable 2.6.1, mode pembuatan indeks default untuk pernyataan | 0 | 0 |
SYNC Penting Hanya LindormTable 2.6.3 dan yang lebih baru yang mendukung pembuatan indeks sinkron. | 0 | ✔ |
Properti indeks (WITH)
Properti secondary index
Properti | Tipe | Deskripsi |
| STRING | Algoritma kompresi untuk tabel indeks. Nilai valid: |
| STRING | Metode redundansi untuk kolom yang disertakan. |
| STRING | Kunci awal untuk tabel indeks. Tidak dapat diatur untuk kolom bertipe timestamp atau data spasial |
| STRING | Kunci akhir untuk tabel indeks. Tidak dapat diatur untuk kolom bertipe timestamp atau data spasial |
| INTEGER | Jumlah pre-partisi untuk tabel indeks. Tidak dapat diatur untuk kolom bertipe timestamp atau data spasial |
Properti search index
Properti | Tipe | Deskripsi |
| STRING | Status awal indeks. Nilai valid: |
| INTEGER | Jumlah shard. Default: dua kali jumlah node pencarian. Pertahankan setiap shard antara 30 juta–100 juta baris dan 30–50 GB. Shard yang melebihi 2 miliar baris memengaruhi stabilitas sistem. Rencanakan jumlah shard sebelum membuat indeks produksi. Untuk data time-series dengan pertumbuhan volume signifikan (seperti pesanan atau log), gunakan indeks terpartisi waktu sebagai gantinya |
| INTEGER | Jumlah hari sebelum pembuatan indeks untuk mulai membuat partisi, untuk data historis. Jika data historis memiliki timestamp lebih awal dari waktu mulai partisi, terjadi error. Wajib diatur saat membuat indeks terpartisi waktu |
| INTEGER | Interval dalam hari antara partisi baru. Misalnya, |
| INTEGER | Periode retensi data dalam hari. Misalnya, |
| INTEGER | Offset maksimum timestamp masa depan yang diizinkan dalam hari. Default: 1 hari |
| LONG | Unit bidang partisi waktu. Default: milidetik (ms). Jika unitnya detik (s), nilai bidang harus 10 digit. Jika unitnya milidetik (ms), harus 13 digit |
| INTEGER | Batas data panas/dingin dalam detik. Misalnya, |
| STRING | Properti indeks kustom dalam bentuk string JSON, kompatibel dengan sintaks pengaturan indeks Elasticsearch. Hanya berlaku untuk versi yang kompatibel dengan Elasticsearch |
| STRING | Kebijakan penyimpanan data mentah untuk kolom indeks, dalam bentuk string JSON yang kompatibel dengan pengaturan |
Contoh
Semua contoh menggunakan tabel utama berikut:
CREATE TABLE test (
p1 VARCHAR NOT NULL,
p2 INTEGER NOT NULL,
c1 BIGINT,
c2 DOUBLE,
c3 VARCHAR,
c4 TIMESTAMP,
c5 GEOMETRY(POINT),
PRIMARY KEY(p1, p2)
) WITH (CONSISTENCY = 'strong', MUTABILITY='MUTABLE_LATEST');Indeks Sekunder
Buat indeks secara asinkron
Mode default adalah ASYNC. Pernyataan mengembalikan respons segera.
CREATE INDEX idx1 ON test(c1 DESC) INCLUDE(c3, c4) WITH (COMPRESSION='ZSTD');Verifikasi hasil:
SHOW INDEX FROM test;Buat indeks komposit secara sinkron
CREATE INDEX idx1 ON test(c1, c2, c3) INCLUDE(c4) SYNC WITH (COMPRESSION='ZSTD');Verifikasi hasil:
SHOW INDEX FROM test;Buat secondary index spatio-temporal
CREATE INDEX idx ON roads (Z-ORDER(g1));
CREATE INDEX idt ON roads (Z-ORDER(g1, t));Lihat Indeks spatio-temporal.
Sertakan semua kolom pradefinisi
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_ALL_COLUMNS_IN_SCHEMA');Verifikasi hasil:
SHOW INDEX FROM test;Sertakan semua kolom dinamis
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_DYNAMIC_COLUMNS');Verifikasi hasil:
SHOW INDEX FROM test;Atur pre-partisi untuk tabel indeks
Buat indeks dengan 32 pre-partisi.
CREATE INDEX idx1 ON test(c4 DESC) INCLUDE(c5, c6) WITH (NUMREGIONS='32');Verifikasi hasil:
SHOW INDEX FROM test;Atur kunci awal dan akhir dengan pre-partisi
Buat tabel indeks dengan 32 pre-partisi antara 11111111 dan 9999999.
CREATE INDEX idx1 ON test(c3 DESC) INCLUDE(c5, c6)
WITH (NUMREGIONS='32', STARTKEY='11111111', ENDKEY='9999999');Verifikasi hasil:
SHOW INDEX FROM test;Buat secondary index Z-ORDER
CREATE INDEX idx1 ON test(Z-ORDER(c5));Verifikasi hasil:
SHOW INDEX FROM test;Buat secondary index grid S2
Indeks S2 hanya mendukung pembuatan asinkron. Jalankan BUILD INDEX untuk memicu pembuatan setelah indeks dibuat.
CREATE INDEX idx1 ON test(S2(c5, 10));
BUILD INDEX s2_idx ON test;Verifikasi hasil:
SHOW INDEX FROM test;Indeks kolom setelah konversi tipe data
Konversi kolom c3 ke INTEGER, lalu buat secondary index pada hasilnya.
CREATE INDEX idx1 ON test(CAST(c3 AS INTEGER));Verifikasi hasil:
SHOW INDEX FROM test;Indeks Pencarian
Buat search index secara asinkron
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(p1, p2, c1, c2, c3);Verifikasi hasil:
SHOW INDEX FROM test;Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.
Indeks semua kolom
Jika tidak ada properti kolom yang ditentukan, nilai default akan diterapkan.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.
Tambahkan properti kunci indeks
Indeks semua kolom dan konfigurasikan kolom c3 untuk tokenisasi IK:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(type=text, analyzer=ik, indexed=true));Untuk menggunakan pemetaan kustom kompatibel Elasticsearch untuk kolom c3:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(mapping='{
"type": "text",
"analyzer": "ik_max_word"
}'));Parameter mapping hanya berlaku untuk versi kompatibel Elasticsearch dan menggantikan semua properti lain untuk kolom tersebut.
Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.
Atur status indeks dan jumlah shard
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, numShards=4);Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.
Atur pengaturan indeks kustom
Buat search index dengan kompresi ZSTD dan interval refresh 10 detik:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, INDEX_SETTINGS='{
"index": {
"codec": "zstd",
"refresh_interval": "10s"
}
}');Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.
Buat search index terpartisi waktu
Partisi berdasarkan kolom c4, dimulai dari 30 hari lalu, dengan partisi baru setiap 7 hari dan periode retensi 90 hari.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c2, c3, c4)
PARTITION BY RANGE TIME(c4) PARTITIONS 16
WITH (
indexState=ACTIVE,
RANGE_TIME_PARTITION_START='30',
RANGE_TIME_PARTITION_INTERVAL='7',
RANGE_TIME_PARTITION_TTL='90',
RANGE_TIME_PARTITION_MAX_OVERLAP='90'
);Untuk memantau progres build, lihat Lihat progres build penuh indeks pencarian.
Simpan data mentah di search index
Secara default, search index memfilter data tetapi tidak menyimpan nilai mentah kolom. Aktifkan penyimpanan data mentah untuk melakukan kueri langsung melalui mesin pencari.
Simpan semua kolom indeks:
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"enabled": true
}');Verifikasi hasil:
SHOW INDEX FROM test;Simpan subset kolom (c2, c3, c4, kecuali c1):
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"includes": ["c*"],
"excludes": ["c1"]
}');Verifikasi hasil:
SHOW INDEX FROM test;Untuk memantau progres pembuatan, lihat Lihat progres pembuatan penuh search index.