全部产品
Search
文档中心

Lindorm:Indeks penyimpanan kolom

更新时间:Dec 06, 2025

Indeks merupakan cara penting untuk mempercepat kueri data. Indeks penyimpanan kolom (columnstore index) meningkatkan kemampuan komputasi analitik untuk data masif dalam tabel lebar. Fitur ini terutama digunakan dalam skenario seperti statistik informasi perangkat pada Internet of Vehicles (IoV) dan Internet of Things (IoT), analitik data di e-commerce, serta statistik pesanan di industri logistik. Topik ini menjelaskan penggunaan dasar dan lanjutan indeks penyimpanan kolom untuk membantu Anda segera memulai dan menguasai fitur ini.

Prasyarat

  • Mesin komputasi telah diaktifkan. Untuk informasi selengkapnya, lihat Aktifkan layanan.

  • LindormDFS telah diaktifkan, dan versinya 4.0.0 atau lebih baru.

  • Mesin tabel lebar telah diaktifkan, dan versinya 2.5.0 atau lebih baru.

Catatan

  • Indeks penyimpanan kolom tidak dapat dibuat secara sinkron.

  • Pembuatan indeks penyimpanan kolom memerlukan waktu sekitar 15 menit. Jika terdapat banyak tugas pembuatan indeks di latar belakang atau volume data bisnis sangat besar, proses ini dapat memakan waktu lebih lama.

  • Pembuatan indeks penyimpanan kolom memerlukan pembacaan ulang data, yang menghasilkan operasi baca. Jika fitur pemisahan data panas dan dingin diaktifkan untuk instans tersebut, perhatikan pembatasan kecepatan pada penyimpanan dingin (storage-optimized cloud storage). Jika operasi baca pada penyimpanan dingin dibatasi kecepatannya, efisiensi pembuatan indeks akan langsung terpengaruh. Hal ini dapat menyebabkan tekanan balik (backpressure) pada operasi tulis.

Aktifkan indeks penyimpanan kolom

  1. Masuk ke Konsol Lindorm.

  2. Di pojok kiri atas halaman, pilih wilayah tempat instans ditempatkan.

  3. Pada halaman Instances, klik ID instans target atau klik View Instance Details di kolom Actions untuk instans tersebut.

  4. Di panel navigasi sebelah kiri, pilih Wide Table Engine.

  5. Klik tab Columnar Index, lalu klik Activate Now.

  6. Pada kotak dialog yang muncul, klik OK.

Memulai dengan Cepat

Misalkan Anda perlu melakukan analisis data secara paralel dan efisien pada tabel data masif bernama my_tbl. Untuk melakukannya, Anda harus membuat indeks penyimpanan kolom untuk tabel tersebut.

Skema tabel contoh my_tbl adalah sebagai berikut:

+------------+-------------+---------+----------------+
| TABLE_NAME | COLUMN_NAME |  TYPE   | IS_PRIMARY_KEY |
+------------+-------------+---------+----------------+
| my_tbl     | pk0         | INT     | true           |
| my_tbl     | pk1         | VARCHAR | true           |
| my_tbl     | pt_d        | VARCHAR | true           |
| my_tbl     | col0        | INT     | false          |
| my_tbl     | col1        | VARCHAR | false          |
| my_tbl     | json_col0   | JSON    | false          |
+------------+-------------+---------+----------------+

Kunci primer pk0 mengidentifikasi setiap baris dan memiliki kardinalitas tinggi. Kunci primer pt_d adalah tanggal pembuatan data. Data biasanya dianalisis berdasarkan harian.

  1. Buat indeks penyimpanan kolom. Indeks penyimpanan kolom dapat secara otomatis memperluas data yang disimpan dalam bidang JSON.

    • Jika skema my_tbl stabil dan tidak sering berubah, jalankan pernyataan berikut:

      CREATE INDEX my_tbl_idx USING COLUMNAR
      ON my_tbl(*) 
      PARTITION BY ENUMERABLE (pt_d, bucket(128, pk0))
      WITH (
        `lindorm_columnar.user.index.database` = 'my_index_db',
        `lindorm_columnar.user.index.table` = 'my_index_tbl',
        `lindorm_columnar.user.syncer.lci.dynamicJsonColumns` = 'json_col0'
        );

      Indeks penyimpanan kolom membuat tabel indeks berdasarkan skema tabel saat ini dan struktur json_col0.

    • Jika skema my_tbl mungkin sering berubah, jalankan pernyataan berikut:

      CREATE INDEX my_tbl_idx USING COLUMNAR
      ON my_tbl(*) 
      PARTITION BY ENUMERABLE (pt_d, bucket(128, pk0))
      WITH (
        `lindorm_columnar.user.index.database` = 'my_index_db',
        `lindorm_columnar.user.index.table` = 'my_index_tbl',
        `lindorm_columnar.user.syncer.lci.dynamicJsonColumns` = 'json_col0',
        `lindorm_columnar.user.syncer.lci.dynamicSchema` = 'true');

      Indeks penyimpanan kolom membuat tabel indeks berdasarkan skema tabel saat ini dan struktur json_col0. Selanjutnya, tabel indeks tersebut diperluas secara dinamis berdasarkan perubahan skema tabel dan konten bidang JSON di masa mendatang.

  2. Lihat status indeks.

    SHOW INDEX FROM my_tbl;

    Untuk informasi selengkapnya tentang penggunaan SHOW INDEX dan deskripsi set hasilnya, lihat SHOW INDEX.

  3. Gunakan indeks penyimpanan kolom untuk kueri dan analisis data. Untuk informasi selengkapnya, lihat Gunakan indeks penyimpanan kolom.

Penggunaan dasar

Misalkan skema tabel contoh my_tbl adalah sebagai berikut:

+------------+-------------+---------+----------------+
| TABLE_NAME | COLUMN_NAME |  TYPE   | IS_PRIMARY_KEY |
+------------+-------------+---------+----------------+
| my_tbl     | pk0         | INT     | true           |
| my_tbl     | pk1         | VARCHAR | true           |
| my_tbl     | pk2         | VARCHAR | true           |
| my_tbl     | col0        | INT     | false          |
| my_tbl     | col1        | VARCHAR | false          |
+------------+-------------+---------+----------------+

Buat indeks penyimpanan kolom

Sintaks

CREATE INDEX index_name USING COLUMNAR
ON table_name(column_name(,..))
PARTITION BY ENUMERABLE (column_name(,...), bucket(bucket_num, column_name))
WITH (`lindorm_columnar.user.index.database` = 'columnar_db_name',
      `lindorm_columnar.user.index.table` = 'columnar_tbl_name');

Deskripsi parameter

Parameter

Deskripsi

index_name

Nama indeks penyimpanan kolom. Nama ini dapat berisi huruf besar, huruf kecil, angka, dan garis bawah (_).

table_name

Nama tabel lebar.

column_name(,...))

Daftar bidang yang akan dibuat indeks penyimpanan kolomnya. Pisahkan beberapa bidang dengan koma (,). Tipe bidang yang didukung mencakup TINYINT, SMALLINT, INTEGER, BIGINT, LONG, FLOAT, DOUBLE, VARCHAR, BINARY, VARBINARY, BOOLEAN, DECIMAL, JSON, DATE, dan TIMESTAMP.

Catatan

Daftar ini harus mencakup semua bidang kunci primer dari tabel lebar. Untuk membuat indeks penyimpanan kolom untuk semua bidang (kunci primer dan non-kunci primer), Anda dapat menggunakan (*) sebagai singkatan.

PARTITION BY ENUMERABLE(column_name(,...), bucket(bucket_num, column_name))

Menentukan bahwa data indeks dipartisi menggunakan algoritma enumerasi untuk meningkatkan kinerja pengambilan selama kueri. Ekspresi filter partisi mencakup ekspresi partisi reguler dan ekspresi partisi bucket. Bidang dalam kedua jenis ekspresi tersebut harus merupakan bidang kunci primer dari tabel lebar.

  • Ekspresi partisi reguler

    • Anda dapat menentukan nol atau lebih ekspresi partisi reguler. Pisahkan beberapa ekspresi dengan koma (,).

    • Ekspresi partisi reguler adalah bidang kunci primer dari tabel lebar, seperti kota atau tanggal. Data indeks dibuat berdasarkan nilai partisi yang berbeda. Hal ini memungkinkan Anda menemukan data secara efisien menggunakan kondisi filter partisi dalam kueri.

  • Ekspresi partisi bucket

    • Tentukan minimal satu ekspresi partisi bucket.

    • bucket_num adalah jumlah partisi bucket. column_name adalah bidang partisi bucket yang digunakan untuk menghitung nomor partisi bucket (bucket_index). Nilai bucket_index dihitung dengan menghitung nilai hash berdasarkan bidang partisi bucket dalam ekspresi, lalu mengambil sisa bagi dari pembagian dengan bucket_num. Dalam contoh berikut, bucket_index dihitung sebagai hash(pk0)%128.

    • Bidang partisi bucket harus merupakan bidang kunci primer dalam tabel lebar. Pastikan bidang partisi bucket memiliki fitur diskrit yang cukup untuk menghindari kesenjangan data antar partisi yang berbeda.

    Ekspresi partisi reguler dan ekspresi partisi bucket bersama-sama menentukan jumlah partisi untuk data indeks. Atur volume data setiap partisi antara 50 MB hingga 512 MB. Misalnya, asumsikan ekspresi partisi reguler adalah bidang tanggal dt, volume data harian tabel lebar adalah 50 GB, dan bidang kunci primer tabel lebar adalah (id, dt). Anda dapat mengonfigurasi ekspresi filter partisi sebagai PARTITION BY ENUMERABLE (dt, bucket(200, id)).

Catatan

Saat merancang kebijakan partisi, hindari penggunaan bidang ber-kardinalitas tinggi (bidang dengan banyak nilai unik) sebagai kunci partisi reguler. Menggunakannya langsung sebagai ekspresi partisi reguler akan membuat banyak partisi dan file kecil, yang berdampak negatif pada sistem penyimpanan.

WITH(`key` = 'value')

Gunakan kata kunci WITH untuk menentukan parameter berikut untuk indeks penyimpanan kolom:

  • lindorm_columnar.user.index.database: Menentukan nama database tempat tabel indeks penyimpanan kolom berada.

  • lindorm_columnar.user.index.table: Menentukan nama tabel indeks penyimpanan kolom.

Contoh

Buat indeks penyimpanan kolom untuk tabel my_tbl:

CREATE INDEX my_tbl_idx USING COLUMNAR
ON my_tbl(pk0, pk1, pk2, col0, col1)
PARTITION BY ENUMERABLE (pk1, pk2, bucket(128, pk0))
WITH (`lindorm_columnar.user.index.database` = 'my_index_db',
      `lindorm_columnar.user.index.table` = 'my_index_tbl');

Lihat indeks penyimpanan kolom

Setelah indeks penyimpanan kolom dibuat, datanya dibangun secara berkelanjutan. Tabel lebar, yang merupakan tabel utama, terus-menerus menyinkronkan datanya ke tabel indeks penyimpanan kolom. Sinkronisasi data mencakup sinkronisasi data historis dan data inkremental. Selama sinkronisasi data inkremental, data indeks tertinggal dari data tabel utama. Keterlambatan ini biasanya kurang dari 1 jam.

Anda dapat menggunakan pernyataan SHOW INDEX untuk melihat status indeks penyimpanan kolom. Untuk informasi selengkapnya tentang penggunaan SHOW INDEX dan deskripsi set hasilnya, lihat SHOW INDEX.

Gunakan indeks penyimpanan kolom

Indeks penyimpanan kolom dapat meningkatkan kemampuan komputasi analitik untuk data masif dalam tabel lebar. Anda dapat menentukan parameter HINT dalam pernyataan kueri SELECT untuk mengarahkan permintaan kueri ke mesin komputasi. Mesin komputasi kemudian menggunakan indeks penyimpanan kolom untuk mempercepat kueri, sehingga meningkatkan efisiensi komputasi data besar.

Contoh 1: Statistik data besar

SELECT /*+ _use_ldps_(cg0), _columnar_index_ */ COUNT(*), SUM(col0), MIN(col0), MAX(col0)
FROM my_index_db.my_index_tbl
WHERE col0 > 100 AND col0 < 200 OR col0 > 500
GROUP BY pk1;

Contoh 2: Pengurutan data besar

SELECT /*+ _use_ldps_(cg0), _columnar_index_ */ pk0 + col0, pk1
FROM my_index_db.my_index_tbl
WHERE col0 > 100 AND col0 < 200 OR col0 > 500
ORDER BY pk1
LIMIT 100;

Contoh 3: Asosiasi data besar

Jika Anda telah membuat indeks penyimpanan kolom untuk beberapa tabel lebar, Anda juga dapat mengasosiasikan data antar tabel lebar tersebut.

SELECT /*+ _use_ldps_(cg0), _columnar_index_ */ *
FROM my_index_db.my_index_tbl0 as t0
  JOIN my_index_db.my_index_tbl1 as t1 
ON t0.pk0 = t1.pk0
AND t0.pk1 = t1.pk1
LIMIT 100;

Hapus indeks penyimpanan kolom

Anda dapat menggunakan pernyataan DROP INDEX untuk menghapus indeks penyimpanan kolom. Untuk informasi selengkapnya tentang penggunaan DROP INDEX dan contohnya, lihat DROP INDEX.

Penggunaan lanjutan

Ekspresi filter partisi kompleks

Misalkan skema tabel contoh my_ts_tbl adalah sebagai berikut:

+------------+-------------+---------+----------------+
| TABLE_NAME | COLUMN_NAME |  TYPE   | IS_PRIMARY_KEY |
+------------+-------------+---------+----------------+
| my_ts_tbl  | id          | INT     | true           |
| my_ts_tbl  | ts          | LONG    | true           |
| my_ts_tbl  | col0        | VARCHAR | false          |
| my_ts_tbl  | col1        | INT     | false          |
+------------+-------------+---------+----------------+

Saat membuat indeks penyimpanan kolom, jika bidang kunci primer tabel lebar tidak dapat langsung digunakan dalam ekspresi partisi untuk indeks penyimpanan kolom, Anda dapat menyertakan logika perhitungan dalam ekspresi partisi. Berikut adalah contohnya.

  • Buat indeks penyimpanan kolom untuk semua bidang tabel lebar dan partisi data indeks penyimpanan kolom berdasarkan hari menggunakan bidang timestamp ts:

    CREATE INDEX my_ts_idx USING COLUMNAR ON my_ts_tbl(*)
    PARTITION BY ENUMERABLE (ifnull(substring(from_unixtime(ts), 0, 10), 'unknown') AS dt, bucket(128, id))
    WITH (`lindorm_columnar.user.index.database` = 'my_ts_index_db',
          `lindorm_columnar.user.index.table` = 'my_ts_index_tbl');
  • Setelah indeks penyimpanan kolom dibuat, Anda dapat menentukan kondisi filter dalam pernyataan kueri untuk mengkueri data dalam indeks penyimpanan kolom.

    SELECT /*+ _use_ldps_ */ COUNT(1)
    FROM lindorm_columnar.my_ts_index_db.my_ts_index_tbl
    WHERE dt = '2020-06-06';

Buat indeks penyimpanan kolom hanya untuk data inkremental

Untuk melewati data historis dalam tabel lebar dan hanya membuat indeks penyimpanan kolom untuk data inkremental, tentukan parameter lindorm_columnar.user.syncer.skip.fullsync = 'true'. Berikut adalah contohnya:

CREATE INDEX my_tbl_idx USING COLUMNAR ON my_tbl(*)
PARTITION BY ENUMERABLE (pk1, pk2, bucket(128, pk0))
WITH (`lindorm_columnar.user.index.database` = 'my_index_db',
      `lindorm_columnar.user.index.table` = 'my_index_tbl',
      `lindorm_columnar.user.syncer.skip.fullsync` = 'true');

Perluas dan simpan bidang JSON

Indeks penyimpanan kolom mendukung perluasan dan penyimpanan bidang JSON selama sinkronisasi data. Dua metode didukung: perluasan dan penyimpanan statis serta perluasan dan penyimpanan dinamis.

Misalkan tabel contoh my_json_tbl memiliki skema tabel berikut:

+-------------+-------------+--------+----------------+
| TABLE_NAME  | COLUMN_NAME |  TYPE  | IS_PRIMARY_KEY |
+-------------+-------------+--------+----------------+
| my_json_tbl | id          | BIGINT | true           |
| my_json_tbl | col1        | INT    | false          |
| my_json_tbl | json_col    | JSON   | false          |
+-------------+-------------+--------+----------------+

Jalankan pernyataan berikut untuk memasukkan data berformat JSON:

UPSERT INTO my_json_tbl (id,col1,json_col) VALUES(2,2,'{"a": {"b": {"c": "hello,world", "d": 123}, "e": false }, "f": 3.14}');

json_col memiliki struktur berikut:

Klik untuk melihat struktur data kolom JSON

{
  "a": {
    "b": {
      "c": "hello,world",
      "d": 123
    },
    "e": false
  },
  "f": 3.14
}

Perluasan statis

Saat membuat indeks penyimpanan kolom, tentukan `lindorm_columnar.user.syncer.lci.jsonMapping.<JSON_COL>` = '<JSON_MAPPING_RULE>' untuk mendefinisikan pemetaan statis antara bidang JSON tabel lebar dan bidang tabel berorientasi kolom. Berikut adalah contohnya:

CREATE INDEX columnar_idx USING COLUMNAR ON my_json_tbl(*) 
PARTITION BY ENUMERABLE (ifnull(id%16, 0) as dt, bucket(16,id)) 
WITH (
  `lindorm_columnar.user.syncer.lci.jsonMapping.json_col` = 'a.b.c VARCHAR, a.e BOOLEAN ,f DOUBLE',
  `lindorm_columnar.user.index.database` = 'my_index_db',
  `lindorm_columnar.user.index.table` = 'my_index_tbl');
Catatan
  • lindorm_columnar.user.syncer.lci.jsonMapping.json_col: Menentukan kolom JSON yang akan diperluas secara statis. Dalam contoh ini, kolom tersebut adalah json_col.

  • a.b.c VARCHAR,a.e BOOLEAN ,f DOUBLE: Menentukan setiap bidang yang diperluas. Pisahkan bidang-bidang tersebut dengan koma (,).

    • Nama bidang: Jalur JSON dari bidang yang diperluas. Pisahkan segmen jalur dengan titik (.). Misalnya, a.b.c.

    • Tipe bidang: Tipe data yang didukung adalah BOOLEAN, BYTE, SHORT, INTEGER, LONG, FLOAT, DOUBLE, dan VARCHAR.

  • Gunakan kata kunci WITH untuk menentukan beberapa parameter lindorm_columnar.user.syncer.lci.jsonMapping dan membuat pemetaan untuk beberapa bidang JSON.

  • Jangan mendefinisikan bidang JSON yang sama dalam pemetaan perluasan statis dan dinamis.

Perluasan kolom dinamis (Pratinjau publik)

Saat membuat indeks penyimpanan kolom, tentukan `lindorm_columnar.user.syncer.lci.dynamicJsonColumns` = '<JSON_COL1>,<JSON_COL2>' untuk memperluas bidang JSON dari tabel lebar secara dinamis dan memetakannya ke tabel berorientasi kolom. Berikut adalah contohnya:

CREATE INDEX columnar_idx USING COLUMNAR ON my_json_tbl(*) 
PARTITION BY ENUMERABLE (ifnull(id%16, 0) as dt, bucket(16,id)) 
WITH (
  `lindorm_columnar.user.syncer.lci.dynamicJsonColumns` = 'json_col',
  `lindorm_columnar.user.index.database` = 'my_index_db',
  `lindorm_columnar.user.index.table` = 'my_index_tbl');
Catatan
  • lindorm_columnar.user.syncer.lci.dynamicJsonColumns: Menentukan kolom JSON yang akan diperluas secara dinamis. Dalam contoh ini, kolom yang ditentukan adalah json_col. Anda dapat menentukan beberapa kolom JSON untuk perluasan dinamis. Pisahkan nama kolom dengan koma (,), misalnya, json_col1,json_col2.

  • Indeks penyimpanan kolom melakukan inferensi tipe data untuk tabel berorientasi kolom dari tipe penyimpanan aktual dalam data JSON. Satu-satunya tipe yang dapat diinferensikan adalah BOOLEAN, LONG, DOUBLE, dan STRING. Jika suatu bidang berisi nilai dengan beberapa tipe, tabel berorientasi kolom menggunakan tipe STRING untuk penyimpanan.

  • Perluasan dinamis bidang JSON tidak didukung saat membangun indeks penyimpanan kolom untuk data historis.

  • Jangan mendefinisikan bidang JSON yang sama dalam pemetaan perluasan statis dan dinamis.

Saat Anda mengonfigurasi bidang JSON untuk perluasan dan penyimpanan statis atau perluasan dan penyimpanan dinamis, bidang JSON asli tidak disimpan dalam tabel berorientasi kolom. Selain itu, nama bidang JSON yang diperluas dalam tabel berorientasi kolom diberi awalan dengan nama bidang JSON yang sesuai.

Misalnya, saat Anda menggunakan `lindorm_columnar.user.syncer.lci.jsonMapping.json_col` = 'a.b.c VARCHAR, a.e BOOLEAN' untuk menentukan perluasan JSON statis untuk indeks penyimpanan kolom, tabel berorientasi kolom tidak akan berisi kolom bernama json_col. Sebagai gantinya, tabel tersebut akan berisi kolom-kolom berikut:

  • Kolom bernama json_col.a.b.c bertipe STRING yang menyimpan nilai a.b.c dari bidang json_col.

  • Kolom bernama json_col.a.e bertipe BOOLEAN yang menyimpan nilai a.e dari bidang json_col.

Jika Anda tetap ingin menyinkronkan bidang JSON asli, atau tidak ingin nama bidang JSON yang diperluas dalam tabel berorientasi kolom diberi awalan dengan nama bidang JSON yang sesuai, Anda dapat menggunakan metode berikut:

Sinkronkan bidang JSON asli

Untuk menyinkronkan bidang JSON asli, tentukan `lindorm_columnar.user.syncer.lci.json.syncOriginalJsonContent` = 'true' saat membuat indeks. Tabel berorientasi kolom kemudian akan berisi kolom-kolom berikut:

  • Kolom bernama json_col bertipe STRING. Kolom ini menyimpan nilai bidang json_col.

  • Kolom bernama json_col.a.b.c bertipe STRING. Kolom ini menyimpan nilai a.b.c dari bidang json_col.

  • Kolom bernama json_col.a.e bertipe BOOLEAN. Kolom ini menyimpan nilai a.e dari bidang json_col.

Abaikan awalan nama bidang JSON dari nama bidang dalam tabel berorientasi kolom

Untuk mencegah nama bidang JSON yang diperluas dalam tabel berorientasi kolom diberi awalan dengan nama bidang JSON asli, tentukan `lindorm_columnar.user.syncer.lci.json.ignoreJsonMappingPrefix` = 'true' saat membuat indeks. Tabel berorientasi kolom kemudian akan berisi kolom-kolom berikut:

  • Kolom bernama a.b.c bertipe STRING. Kolom ini menyimpan nilai a.b.c dari bidang json_col.

  • Kolom bernama a.e bertipe BOOLEAN. Kolom ini menyimpan nilai a.e dari bidang json_col.

Penting

Jika bidang JSON berbeda, seperti json_col1 dan json_col2, berisi pemetaan yang sama untuk memperluas dan menyimpan nilai a.b.c, pembuatan indeks penyimpanan kolom akan gagal.

Rasakan evolusi skema secara dinamis (Pratinjau publik)

Selama sinkronisasi data, indeks penyimpanan kolom dapat secara dinamis mendeteksi perubahan skema dalam tabel data dan menerapkannya pada skema tabel berorientasi kolom. Saat membuat indeks penyimpanan kolom, Anda dapat menentukan `lindorm_columnar.user.syncer.lci.dynamicSchema` = 'true' untuk memastikan skema tabel berorientasi kolom tetap konsisten dengan skema tabel utama. Berikut adalah contohnya:

CREATE INDEX my_tbl_idx USING COLUMNAR
ON my_tbl(*) 
PARTITION BY ENUMERABLE (pt_d, bucket(128, pk0))
WITH (
  `lindorm_columnar.user.index.database` = 'my_index_db',
  `lindorm_columnar.user.index.table` = 'my_index_tbl',
  `lindorm_columnar.user.syncer.lci.dynamicSchema` = 'true');
Penting

Jika tabel utama memiliki kolom dinamis atau kolom wildcard, dan Anda menentukan lindorm_columnar.user.syncer.lci.dynamicSchema = 'true' saat membuat indeks penyimpanan kolom, kolom dinamis dan wildcard dari tabel utama akan disinkronkan ke indeks penyimpanan kolom.

Tambahkan kolom ke tabel berorientasi kolom (Pratinjau publik)

Setelah membuat indeks penyimpanan kolom, Anda dapat menggunakan sintaks ALTER INDEX untuk menambahkan bidang ke indeks penyimpanan kolom tanpa melakukan pengindeksan ulang. Anda dapat menambahkan bidang reguler atau kolom pemetaan untuk perluasan statis bidang JSON.

Misalkan skema tabel my_json_tbl adalah sebagai berikut:

+-------------+-------------+---------+----------------+
|  TABLE_NAME | COLUMN_NAME |  TYPE   | IS_PRIMARY_KEY |
+-------------+-------------+---------+----------------+
| my_json_tbl | id          | BIGINT  | true           |
| my_json_tbl | col1        | INT     | false          |
| my_json_tbl | col2        | VARCHAR | false          |
| my_json_tbl | json_col1   | JSON    | false          |
| my_json_tbl | json_col2   | JSON    | false          |
+--------------+-------------+---------+----------------+

Anda dapat menggunakan pernyataan SQL berikut untuk membuat indeks penyimpanan kolom:

CREATE INDEX columnar_idx USING COLUMNAR ON my_json_tbl(id, col1, json_col1) 
PARTITION BY ENUMERABLE (ifnull(id%16, 0) as dt, bucket(16,id)) 
WITH (
  `lindorm_columnar.user.syncer.lci.jsonMapping.json_col1` = 'a.b.c VARCHAR, a.e BOOLEAN',
  `lindorm_columnar.user.index.database` = 'my_index_db',
  `lindorm_columnar.user.index.table` = 'my_index_tbl');

Pada tahap ini, tabel berorientasi kolom tidak berisi kolom yang terkait dengan col2 atau json_col2. Anda dapat menggunakan pernyataan berikut untuk menambahkan bidang reguler ke indeks penyimpanan kolom:

ALTER INDEX IF EXISTS columnar_idx ON my_json_tbl ADD COLUMNS(col2);

Anda juga dapat menggunakan pernyataan berikut untuk menambahkan aturan pemetaan statis untuk bidang JSON ke indeks penyimpanan kolom:

ALTER INDEX IF EXISTS columnar_idx ON my_json_tbl
ADD COLUMNS (
  json_extract_long(json_col2, '$.key1'),
  json_extract_boolean(json_col2, '$.key2'),
  json_extract_double(json_col2, '$.key3.key4')
);
Catatan

Saat ini, hanya fungsi ekstraksi json_extract_boolean, json_extract_long, json_extract_double, dan json_extract_string yang didukung.

FAQ

  • Q: Apakah ada biaya tambahan untuk membuat indeks penyimpanan kolom?

    A: Ya, ada. Biaya utama meliputi biaya penyimpanan untuk data indeks penyimpanan kolom dan biaya CU yang digunakan untuk sinkronisasi data antara tabel utama dan indeks penyimpanan kolom.

  • Q: Dapatkah ekspresi filter partisi berisi bidang non-kunci primer?

    A: Tidak, tidak bisa. Semua bidang dalam ekspresi filter partisi harus merupakan bidang kunci primer.

  • Q: Dapatkah ekspresi partisi bucket berisi ekspresi filter partisi kompleks?

    A: Tidak, tidak bisa. Ekspresi partisi bucket hanya mencakup bucket_num dan bidang partisi bucket.

  • Q: Apa dampak memiliki terlalu banyak atau terlalu sedikit partisi?

    A: Terlalu banyak partisi dapat menyebabkan pembengkakan data, yang memengaruhi efisiensi kueri. Oleh karena itu, pastikan volume data satu partisi lebih dari 50 MB, dan bucket_num dalam ekspresi partisi bucket kurang dari 1024. Terlalu sedikit partisi dapat memengaruhi throughput baca-tulis data atau menyebabkan kesenjangan data. Pastikan volume data satu partisi kurang dari 512 MB.

  • Q: Dapatkah saya langsung mengakses data indeks penyimpanan kolom menggunakan mesin komputasi Lindorm?

    A: Ya, bisa. Anda harus terlebih dahulu menyesuaikan nama tabel indeks, lalu mengakses data indeks penyimpanan kolom melalui mesin komputasi. Untuk informasi selengkapnya, lihat Akses data penyimpanan kolom.

    Penting

    Berhati-hatilah saat memodifikasi tabel indeks penyimpanan kolom. Untuk memodifikasi tabel indeks penyimpanan kolom, hubungi dukungan teknis Lindorm (ID DingTalk: s0s3eg3).

  • Q: Dapatkah saya membuat beberapa indeks penyimpanan kolom untuk tabel lebar yang sama?

    A: Tidak, tidak bisa. Anda hanya dapat membuat satu indeks penyimpanan kolom untuk satu tabel lebar.

  • Q: Jika data dalam tabel lebar dihapus karena TTL-nya kedaluwarsa, apakah data dalam indeks penyimpanan kolom secara otomatis dihapus?

    J: Tidak.

  • Q: Pembuatan indeks penyimpanan kolom saya gagal. Mengapa saya mendapatkan error saat mencoba membuatnya lagi?

  • A: Anda hanya dapat membuat satu indeks penyimpanan kolom untuk satu tabel lebar, bahkan jika upaya sebelumnya untuk membuat indeks gagal. Anda harus terlebih dahulu menghapus indeks penyimpanan kolom yang gagal sebelum dapat membuat yang baru. Untuk sintaks penghapusan indeks penyimpanan kolom, lihat DROP INDEX.