Topik ini menjelaskan cara membuat dan menghapus Indeks Kolom dalam Memori tingkat tabel (IMCI).
Persyaratan Versi
Kluster Anda harus memenuhi persyaratan versi berikut:
PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.45 atau yang lebih baru.
PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.27 atau yang lebih baru.
Perintah sederhana untuk satu tabel
Buat IMCI Tingkat Tabel
Anda dapat mengeksekusi pernyataan CREATE COLUMNAR INDEX ON untuk membuat IMCI tingkat tabel. Sintaks:
CREATE COLUMNAR INDEX ON <db_name>.<table_name>;CREATE COLUMNAR INDEX ON <table_name>;Sintaks untuk membuat IMCI tingkat tabel mirip dengan sintaks untuk membuat indeks sekunder non-IMCI, kecuali Anda tidak perlu menentukan nama untuk IMCI tingkat tabel atau kolom yang termasuk dalam IMCI. Parameter db_name menentukan database dalam sesi saat ini.
Anda tidak dapat mengonfigurasi IMCI kustom. Untuk informasi tentang cara mengaktifkan penyesuaian IMCI, lihat Gunakan atribut ekstensi IMCI untuk menyesuaikan IMCI.
Jika tidak ada IMCI tingkat tabel pada tabel yang ditentukan dalam pernyataan DDL, IMCI langsung dibuat di tabel setelah Anda mengeksekusi pernyataan tersebut. Untuk mencegah kesalahan ketika Anda mengeksekusi pernyataan pada tabel yang sudah memiliki IMCI tingkat tabel, Anda dapat menambahkan klausa
IF NOT EXISTSsebelum kata kunciON.Secara default, pernyataan CREATE COLUMNAR INDEX ON setara dengan pernyataan ALTER TABLE berikut:
ALTER TABLE <db_name>.<table_name> COMMENT 'COLUMNAR=1 <OLD_COMMENT>';Pernyataan di atas hanya berlaku setelah Anda mengatur parameter allow_implicit_imci_alter_comment menjadi OFF.
Hapus IMCI Tingkat Tabel
Berikut adalah sintaks untuk DROP COLUMNAR INDEX ON:
DROP COLUMNAR INDEX ON <db_name>.<table_name>;DROP COLUMNAR INDEX ON <table_name>;Sintaks untuk menghapus IMCI tingkat tabel mirip dengan sintaks untuk menghapus indeks sekunder non-IMCI, kecuali Anda tidak perlu menentukan nama IMCI tingkat tabel. Parameter <db_name> menentukan database dalam sesi saat ini.
Jika IMCI tingkat tabel ada di tabel yang ditentukan dalam pernyataan, IMCI langsung dihapus dari tabel setelah Anda mengeksekusi pernyataan tersebut. Untuk mencegah kesalahan ketika Anda mengeksekusi pernyataan pada tabel yang IMCI tingkat tabelnya sudah dihapus, Anda dapat menambahkan klausa
IF EXISTSsebelum kata kunciON.Pernyataan DROP COLUMNAR INDEX ON setara dengan kombinasi dua pernyataan ALTER TABLE berikut:
ALTER TABLE <db_name>.<table_name> COMMENT 'COLUMNAR=0 <OLD_COMMENT>'; ALTER TABLE <db_name>.<table_name> COMMENT '<OLD_COMMENT>';
Buat IMCI Tingkat Tabel Secara Batch
Berikut adalah sintaks untuk CREATE COLUMNAR FOR TABLES IN:
CREATE COLUMNAR INDEX FOR TABLES IN <db_name>;Berikut adalah sintaks untuk CREATE COLUMNAR FOR TABLES FROM:
CREATE COLUMNAR INDEX FOR TABLES FROM <db_name>;Berikut adalah sintaks untuk CALL:
-- dbms_imci: nama paket database yang digunakan untuk mengelola operasi terkait IMCI.
-- add_columnar_index: nama prosedur tersimpan yang ingin Anda panggil. Anda dapat menggunakan prosedur tersimpan ini untuk membuat IMCI untuk database tertentu.
CALL dbms_imci.add_columnar_index('<db_name>');Parameter set_implicit dari prosedur tersimpan bersifat opsional. Jika Anda mengatur parameter set_implicit ke 1, sistem menambahkan penanda implicit_imci ke database. Kemudian, ketika Anda membuat tabel baru di database, sistem secara otomatis membuat IMCI di tabel tersebut.
Untuk semua tabel yang ada di database yang ditentukan
<db_name>, IMCI tingkat tabel dibuat jika belum ada.Anda tidak dapat mengonfigurasi IMCI kustom. Untuk informasi tentang cara mengaktifkan penyesuaian IMCI, lihat Gunakan atribut ekstensi IMCI untuk menyesuaikan IMCI.
Sintaks untuk membuat IMCI tingkat tabel mirip dengan sintaks untuk membuat indeks sekunder non-IMCI, kecuali Anda tidak perlu menentukan nama untuk IMCI tingkat tabel atau kolom yang termasuk dalam IMCI.
Contoh:
mysql> SHOW tables IN tpch;
+--------------------+
| Tables_in_tpch |
+--------------------+
| customer |
| lineitem |
| nation |
| orders |
| part |
| partsupp |
| region |
| revenue0 |
| supplier |
+--------------------+
9 rows in set (0.01 sec)
mysql> SHOW imci indexes;
Empty set (0.02 sec)
mysql> CREATE COLUMNAR INDEX FOR TABLES IN tpch;
+------------+--------+
| Table_Name | Result |
+------------+--------+
| customer | Ok |
| lineitem | Ok |
| nation | Ok |
| orders | Ok |
| part | Ok |
| partsupp | Ok |
| region | Ok |
| supplier | Ok |
+------------+--------+
8 rows in set (0.56 sec)
-- Jika nilai field STATE adalah COMMITTED, IMCI telah dibuat. Jika tidak, IMCI masih dalam proses pembuatan.
mysql> SHOW imci indexes;
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
| TABLE_ID | SCHEMA_NAME | TABLE_NAME | NUM_COLS | NUM_PACKS | PACK_SIZE | ROW_ID | STATE | STATE_UPDATE_AT | CHECKPOINT_DATADIR | WRITE_POLICY |
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
| 1080 | tpch | region | 3 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1080_258 | Tradeoff |
| 1081 | tpch | nation | 4 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1081_254 | Tradeoff |
| 1082 | tpch | part | 9 | 64 | 65536 | 4194304 | RECOVER_BUILDING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1082_256 | Tradeoff |
| 1083 | tpch | supplier | 7 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1083_259 | Tradeoff |
| 1084 | tpch | partsupp | 5 | 0 | 65536 | 0 | RECOVERING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1084_257 | Tradeoff |
| 1085 | tpch | customer | 8 | 64 | 65536 | 4194304 | RECOVER_BUILDING | 2024-09-24 18:50:15 | ./imci_1/imci_chkp_1085_252 | Tradeoff |
| 1086 | tpch | orders | 9 | 0 | 65536 | 0 | RECOVER_BUILDING | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1086_255 | Tradeoff |
| 1087 | tpch | lineitem | 15 | 0 | 65536 | 0 | RECOVER_BUILDING | 2024-09-24 18:50:15 | ./imci_1/imci_chkp_1087_253 | Tradeoff |
+----------+-------------+------------+----------+-----------+-----------+---------+------------------+---------------------+-----------------------------+--------------+
8 rows in set, 1 warning (0.07 sec)Hapus Indeks Kolom dalam Memori secara massal
Berikut adalah sintaks untuk DROP COLUMNAR INDEX FOR TABLES IN:
DROP COLUMNAR INDEX FOR TABLES IN <db_name>;Berikut adalah sintaks untuk DROP COLUMNAR INDEX FOR TABLES FROM:
DROP COLUMNAR INDEX FOR TABLES FROM <db_name>;Berikut adalah sintaks untuk CALL:
-- dbms_imci: nama paket database yang digunakan untuk mengelola operasi terkait IMCI.
-- drop_columnar_index: nama prosedur tersimpan yang ingin Anda panggil. Anda dapat menggunakan prosedur tersimpan ini untuk menghapus IMCI tingkat tabel di database yang ditentukan.
CALL dbms_imci.drop_columnar_index('<db_name>');Parameter reset_implicit dari prosedur tersimpan bersifat opsional. Jika Anda mengatur parameter reset_implicit ke 1, sistem menghapus penanda implicit_imci dari database. Dalam hal ini, IMCI tingkat tabel tidak akan dibuat secara otomatis di tabel baru yang dibuat di database.
Semua IMCI tingkat tabel yang ada dihapus dari semua tabel di database yang ditentukan <db_name>.
mysql> SHOW imci indexes;
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
| TABLE_ID | SCHEMA_NAME | TABLE_NAME | NUM_COLS | NUM_PACKS | PACK_SIZE | ROW_ID | STATE | STATE_UPDATE_AT | CHECKPOINT_DATADIR | WRITE_POLICY |
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
| 1080 | tpch | region | 3 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:30 | ./imci_1/imci_chkp_1080_258 | Tradeoff |
| 1081 | tpch | nation | 4 | 1 | 65536 | 65536 | COMMITTED | 2024-09-24 18:50:16 | ./imci_1/imci_chkp_1081_254 | Tradeoff |
| 1082 | tpch | part | 9 | 306 | 65536 | 20054016 | COMMITTED | 2024-09-24 18:50:30 | ./imci_1/imci_chkp_1082_256 | Tradeoff |
| 1083 | tpch | supplier | 7 | 16 | 65536 | 1048576 | COMMITTED | 2024-09-24 18:50:34 | ./imci_1/imci_chkp_1083_259 | Tradeoff |
| 1084 | tpch | partsupp | 5 | 1221 | 65536 | 80019456 | COMMITTED | 2024-09-24 18:51:15 | ./imci_1/imci_chkp_1084_257 | Tradeoff |
| 1085 | tpch | customer | 8 | 229 | 65536 | 15007744 | COMMITTED | 2024-09-24 18:50:28 | ./imci_1/imci_chkp_1085_252 | Tradeoff |
| 1086 | tpch | orders | 9 | 2289 | 65536 | 150011904 | COMMITTED | 2024-09-24 18:51:23 | ./imci_1/imci_chkp_1086_255 | Tradeoff |
| 1087 | tpch | lineitem | 15 | 9156 | 65536 | 600047616 | COMMITTED | 2024-09-24 18:54:16 | ./imci_1/imci_chkp_1087_253 | Tradeoff |
+----------+-------------+------------+----------+-----------+-----------+-----------+-----------+---------------------+-----------------------------+--------------+
8 rows in set, 1 warning (1.09 sec)
mysql> CALL dbms_imci.drop_columnar_index('tpch');
+-------------+------------+--------+
| Object_Name | Operation | Result |
+-------------+------------+--------+
| customer | drop_index | Ok |
| lineitem | drop_index | Ok |
| nation | drop_index | Ok |
| orders | drop_index | Ok |
| part | drop_index | Ok |
| partsupp | drop_index | Ok |
| region | drop_index | Ok |
| supplier | drop_index | Ok |
+-------------+------------+--------+
8 rows in set (0.33 sec)
mysql> SHOW imci indexes;
Empty set (0.27 sec)Hasil operasi massal
Hasil dari operasi pembuatan dan penghapusan massal IMCI tingkat tabel di atas ditampilkan dalam format tabel. Kolom Hasil menunjukkan hasil operasi untuk setiap tabel. Tabel berikut menjelaskan kemungkinan kode hasil:
Kode hasil | Deskripsi |
Ok | Operasi selesai. Misalnya, IMCI tingkat tabel telah dibuat atau dihapus. |
Skip by unsupported | Operasi tidak didukung. |
Skip by no change | Objek target sudah ada atau statusnya sudah sesuai. Misalnya, sistem melewati operasi pembuatan jika IMCI tingkat tabel sudah ada. |
Skip by concurrent operation | Ada konflik operasi konkuren. Misalnya, sistem tidak dapat memperoleh kunci metadata (MDL) karena operasi DDL lain pada tabel. |
Skip by not found | Objek target tidak ada. |
Skip by ACL deny | Akun saat ini tidak memiliki izin yang diperlukan. |
Failed | Operasi gagal. |
Tambahkan IMCI tingkat tabel tanpa mengubah komentar tabel
Tabel ini menjelaskan parameter yang digunakan untuk mengonfigurasi fitur IMCI implisit.
Parameter | Level | Deskripsi |
allow_implicit_imci_alter_comment | Sesi | Menentukan apakah komentar tingkat tabel dapat dimodifikasi. Nilai valid:
|
Jika Anda mengatur parameter allow_implicit_imci_alter_comment ke OFF, Anda dapat membuat IMCI tingkat tabel di tabel tanpa menggunakan komentar. Konfigurasi ini cocok untuk skenario berikut:
Anda mengeksekusi pernyataan
CREATE TABLEketika parameter loose_polar_enable_implicit_imci_with_create_table diatur ke ON.Anda mengeksekusi pernyataan CREATE COLUMNAR INDEX ON <db>.<table> untuk membuat IMCI tingkat tabel secara dinamis.
Indeks penyimpanan kolom dibuat selama operasi penambahan massal.
Contoh 1:
SET allow_implicit_imci_alter_comment = OFF;
-- Buat tabel dan buat IMCI di tabel.
SET GLOBAL polar_enable_implicit_imci_with_create_table = ON;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
SHOW CREATE TABLE t1 FULL;
/*
Table Create Table t1
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/Contoh 2:
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
SET allow_implicit_imci_alter_comment = OFF;
-- CREATE COLUMNAR INDEX ON table;
CREATE COLUMNAR INDEX ON test.t1;
SHOW CREATE TABLE t1 FULL;
/*
Table Create Table t1
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/Contoh 3:
*/
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(100));
CREATE TABLE t2 (id INT PRIMARY KEY, code DOUBLE);
SET allow_implicit_imci_alter_comment = OFF;
-- CREATE COLUMNAR INDEX FOR TABLES IN db;
CREATE COLUMNAR INDEX FOR TABLES IN test;
/*
Table_Name Result
t1 Ok
t2 Ok
*/
SHOW CREATE TABLE t1 FULL;
/*
Table Create Table t1
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/
SHOW CREATE TABLE t2 FULL;
/*
Table Create Table t2
CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`code` double DEFAULT NULL,
PRIMARY KEY (`id`),
COLUMNAR INDEX (`id`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/Keuntungan
Anda tidak perlu memodifikasi komentar tabel pengguna. Misalnya, dalam skenario bisnis SaaS, konfigurasi ini memastikan bahwa informasi tabel pengguna tenant besar (IMCI tingkat tabel dibuat) konsisten dengan informasi tabel pengguna tenant kecil (tidak ada IMCI tingkat tabel yang dibuat). Ini memfasilitasi proses validasi yang dilakukan menggunakan alat ekologi.
Kerugian
Dalam skenario di mana Anda melakukan sinkronisasi data primer/sekunder menggunakan log biner, Anda tidak dapat membuat IMCI di database sekunder karena komentar terkait IMCI hilang. Untuk membuat IMCI di database sekunder, pastikan pengaturan parameter terkait database sekunder sama dengan pengaturan parameter database primer.
Anda tidak dapat mengonfigurasi IMCI kustom. Untuk informasi tentang cara mengaktifkan penyesuaian IMCI, lihat Gunakan atribut ekstensi IMCI untuk menyesuaikan IMCI.