Topik ini menjawab pertanyaan umum mengenai fitur In-Memory Columnar Index (IMCI) untuk PolarDB for MySQL.
Bagaimana cara menggunakan fitur IMCI dari PolarDB for MySQL?
Untuk menggunakan IMCI guna mempercepat kueri Anda, lakukan langkah-langkah berikut:
-
Tambahkan node read-only IMCI ke kluster PolarDB for MySQL. Saat menambahkan node tersebut, pastikan fitur IMCI diaktifkan. Untuk petunjuknya, lihat Tambahkan node read-only IMCI.
-
Buat IMCI pada tabel yang memerlukan performa kueri lebih cepat. Gunakan pernyataan
CREATE TABLEatauALTER TABLEdan tambahkanCOLUMNAR=1ke bidangCOMMENTtabel. Setelah IMCI siap, pengoptimal secara otomatis menentukan apakah akan menggunakannya berdasarkan biaya kueri. Untuk detail sintaksis, lihat Buat IMCI saat membuat tabel. -
Arahkan kueri SQL Anda ke node read-only IMCI. Pengoptimal secara otomatis menggunakan IMCI untuk kueri yang biaya kuerinya melebihi ambang batas tertentu. Untuk informasi lebih lanjut mengenai pengarahan kueri otomatis dan manual, lihat Konfigurasikan titik akhir kluster untuk memisahkan trafik antara node penyimpanan baris dan node IMCI.
Bagaimana cara memeriksa status IMCI
Setelah menambahkan IMCI ke tabel yang sudah ada menggunakan pernyataan ALTER TABLE, indeks dibuat secara asinkron pada node read-only IMCI. Untuk memeriksa statusnya, hubungkan ke database melalui titik akhir kluster yang diaktifkan untuk distribusi permintaan atau hubungkan langsung ke node read-only IMCI. Anda kemudian dapat melakukan kueri terhadap tabel INFORMATION_SCHEMA.IMCI_INDEXES. IMCI hanya tersedia untuk kueri jika statusnya adalah COMMITTED. Untuk memantau progres pembuatan IMCI, lakukan kueri terhadap tabel INFORMATION_SCHEMA.IMCI_ASYNC_DDL_STATS. Untuk informasi lebih lanjut, lihat Lihat status indeks.
Saat masuk ke database menggunakan Data Management Service (DMS), Anda secara default terhubung ke titik akhir kluster primary. Untuk terhubung ke titik akhir kluster lain atau langsung ke node read-only IMCI, ikuti petunjuk berikut:
-
Terhubung ke titik akhir kluster.
Masuk ke konsol Data Management Service (DMS) 5.0. Pada halaman Add Instance, atur Entry method ke Connection string dan masukkan titik akhir kluster. Untuk informasi lebih lanjut, lihat Tambahkan instans database cloud.
-
Terhubung langsung ke node read-only IMCI.
Pertama, buat titik akhir kluster kustom untuk node read-only IMCI target dan pastikan titik akhir tersebut hanya mencakup node tersebut. Selanjutnya, masuk ke konsol Data Management Service (DMS) 5.0. Pada halaman Add Instance, atur Entry method ke Connection string, lalu masukkan titik akhir kluster kustom dari node read-only IMCI. Untuk informasi selengkapnya, lihat Tambahkan instans database cloud.
Konfirmasi penggunaan IMCI dan lihat rencana eksekusi
Gunakan pernyataan EXPLAIN untuk melihat rencana eksekusi suatu kueri. Kehadiran IMCI Execution Plan dalam output menunjukkan bahwa IMCI mempercepat kueri tersebut. Berikut contohnya:
*************************** 1. row ***************************
IMCI Execution Plan (max_dop = 8, max_query_mem = 3435134976):
Project | Exprs: temp_table3.lineitem.L_ORDERKEY, temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT), temp_table3.orders.O_ORDERDATE, temp_table3.orders.O_SHIPPRIORITY
Sort | Exprs: temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT) DESC,temp_table3.orders.O_ORDERDATE ASC
HashGroupby | OutputTable(3): temp_table3 | Grouping: lineitem.L_ORDERKEY orders.O_ORDERDATE orders.O_SHIPPRIORITY | Output Grouping: lineitem.L_ORDERKEY, orders.O_ORDERDATE, orders.O_SHIPPRIORITY | Aggrs: SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT)
HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_ORDERKEY = lineitem.L_ORDERKEY
HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_CUSTKEY = customer.C_CUSTKEY
CTableScan | InputTable(0): orders | Pred: (orders.O_ORDERDATE < 03/24/1995 00:00:00.000000)
CTableScan | InputTable(1): customer | Pred: (customer.C_MKTSEGMENT = "BUILDING")
CTableScan | InputTable(2): lineitem | Pred: (lineitem.L_SHIPDATE > 03/24/1995 00:00:00.000000)
1 row in set (0.04 sec)
Rencana eksekusi untuk kueri yang menggunakan IMCI berbentuk struktur pohon, dengan setiap level merepresentasikan suatu operator. Umumnya, setiap operator berkorespondensi dengan operasi dalam kueri SQL. Sebagai contoh, operator CTableScan melakukan pemindaian tabel, operator HashJoin berkorespondensi dengan klausa JOIN, dan operator HashGroupby berkorespondensi dengan klausa GROUP BY. Namun, beberapa operator—seperti Sequence—dihasilkan selama proses optimasi kueri dan tidak secara langsung memetakan ke operasi dalam kueri aslinya.
Penyelesaian masalah kueri yang tidak menggunakan IMCI
IMCI hanya mempercepat kueri jika beberapa kondisi terpenuhi: IMCI ada pada tabel yang dikueri, perkiraan biaya kueri melebihi ambang batas tertentu, dan kueri diarahkan ke node read-only IMCI. Jika kueri tidak menggunakan IMCI, ikuti langkah troubleshooting berikut:
-
Verifikasi bahwa kueri diarahkan ke node read-only IMCI.
Gunakan fitur SQL Explorer and Audit untuk memverifikasi bahwa kueri diarahkan ke node read-only IMCI.
Jika Anda menggunakan titik akhir kluster dengan pemisahan trafik otomatis diaktifkan, PolarProxy secara otomatis mengarahkan kueri yang memiliki perkiraan biaya lebih tinggi daripada nilai
imci_ap_thresholdke node read-only IMCI. Anda juga dapat memaksa pengarahan kueri ke node read-only IMCI dengan menambahkan petunjuk/*FORCE_IMCI_NODES*/sebelum kata kunciSELECT. Contoh:/*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;Untuk informasi lebih lanjut, lihat Konfigurasikan pemisahan trafik otomatis.
CatatanUntuk memastikan kueri selalu diarahkan ke node read-only IMCI, buat titik akhir baru yang terhubung langsung ke node tersebut.
-
Periksa apakah biaya kueri melebihi ambang batas.
Pada node read-only IMCI, pengoptimal memperkirakan biaya kueri. Jika perkiraan biaya melebihi nilai parameter
cost_threshold_for_imci, kueri akan menggunakan IMCI. Jika tidak, kueri akan menggunakan row index standar.Setelah memastikan kueri diarahkan ke node read-only IMCI, jika rencana eksekusi tetap tidak menunjukkan penggunaan IMCI, kemungkinan biaya kueri yang diperkirakan terlalu rendah. Periksa biaya perkiraan kueri terakhir yang dieksekusi dengan melihat variabel
Last_query_cost_for_imci:EXPLAIN SELECT * FROM t1; SHOW STATUS LIKE 'Last_query_cost_for_imci';Jika perkiraan biaya eksekusi pernyataan SQL kurang dari
cost_threshold_for_imciyang telah ditetapkan, Anda dapat mempertimbangkan untuk menyesuaikancost_threshold_for_imci. Misalnya, gunakan petunjuk untuk menyesuaikan ambang batas yang telah ditetapkan untuk satu pernyataan SQL:/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1; -
Periksa apakah semua kolom yang digunakan dalam kueri telah dicakup oleh IMCI.
Gunakan prosedur tersimpan bawaan
dbms_imci.check_columnar_index()untuk memeriksa apakah IMCI telah dibuat pada tabel dalam suatu kueri. Contoh:CALL dbms_imci.check_columnar_index('SELECT COUNT(*) FROM t1 WHERE t1.a > 1');Jika kueri merujuk kolom yang tidak dicakup oleh IMCI, prosedur tersimpan tersebut akan mengembalikan daftar tabel dan kolom yang tidak tercakup. Jika semua kolom telah tercakup, prosedur tersebut akan mengembalikan set hasil kosong.
-
Periksa fitur SQL yang tidak didukung.
Tinjau Batasan untuk memastikan semua fitur dalam kueri Anda didukung oleh IMCI.
Jika semua pemeriksaan ini berhasil, kueri seharusnya menggunakan IMCI.
Apakah node read-only IMCI dapat menggunakan row index?
Ya. Node read-only IMCI merupakan node read-only standar dengan fitur IMCI yang diaktifkan. Dengan demikian, node tersebut dapat memanfaatkan IMCI maupun row index standar. Pengoptimal memilih indeks yang akan digunakan berdasarkan nilai cost_threshold_for_imci.
Anda dapat menggunakan petunjuk untuk mengatur ambang batas biaya kueri untuk satu kueri guna memaksa penggunaan IMCI:
SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
Demikian pula, Anda dapat memaksa kueri agar tidak menggunakan IMCI:
SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;
Bagaimana cara membuat IMCI yang sesuai untuk suatu kueri
Agar kueri dapat menggunakan IMCI, semua kolom yang dirujuk kueri harus dicakup oleh IMCI. Jika beberapa kolom tidak tercakup, Anda dapat menambahkannya ke IMCI dengan menggunakan pernyataan CREATE TABLE atau ALTER TABLE. PolarDB for MySQL menyediakan beberapa prosedur tersimpan bawaan untuk membantu proses ini.
Gunakan prosedur tersimpan dbms_imci.columnar_advise() untuk menghasilkan pernyataan DDL yang diperlukan untuk kueri tertentu. Membuat IMCI menggunakan pernyataan DDL ini memastikan semua kolom dalam kueri tercakup. Untuk informasi lebih lanjut, lihat Dapatkan pernyataan DDL untuk membuat IMCI.
dbms_imci.columnar_advise('<query_string>');
Jika Anda menggunakan Multi-primary Cluster (Limitless), Anda harus menjalankan prosedur tersimpan ini pada node read-only global. Anda dapat menambahkan petunjuk /*force_node='<node_id>'*/ sebelum pernyataan SQL untuk memaksa eksekusi pada node read-only global tertentu. Contohnya: /*force_node='pi-bpxxxxxxxx'*/ dbms_imci.columnar_advise('<query_string>');
Gunakan antarmuka dbms_imci.columnar_advise_begin(), dbms_imci.columnar_advise_end(), dan dbms_imci.columnar_advise() untuk mendapatkan pernyataan DDL yang diperlukan untuk batch kueri SQL. Untuk informasi lebih lanjut, lihat Ambil batch pernyataan DDL untuk membuat IMCI.
PolarDB for MySQL IMCIApakah mendukung kueri paralel single-node? Jika ya, bagaimana cara menyesuaikan tingkat paralelisme untuk kueri SQL tertentu?
Kueri paralel pada single node diaktifkan secara default. Jalankan EXPLAIN untuk melihat rencana eksekusi, di mana bidang max_dop menunjukkan tingkat paralelisme aktual yang digunakan. Untuk menyesuaikan tingkat paralelisme pada kueri tertentu, atur parameter imci_max_dop pada tingkat sesi sebelum mengeksekusi kueri. Contohnya:
set imci_max_dop=8; explain select xxxx
Penggunaan sumber daya tinggi dan pemantauan
-
Secara default, IMCI dikonfigurasi untuk mengeksekusi satu kueri secara paralel dengan memanfaatkan seluruh sumber daya CPU yang tersedia. Ketika beberapa kueri dijalankan secara bersamaan, penjadwal internal database mengelola sumber daya tersebut dengan secara dinamis mengurangi batas CPU dan memori untuk setiap kueri. Akibatnya, rata-rata penggunaan CPU dan memori pada node read-only IMCI umumnya lebih tinggi dibandingkan node lainnya. Anda dapat mengontrol tingkat paralelisme maksimum (jumlah maksimum core CPU) untuk satu kueri dengan menyesuaikan parameter
imci_max_dop. -
Kami merekomendasikan mengatur ambang batas peringatan pemantauan menjadi 70% untuk penggunaan CPU dan 90% untuk penggunaan memori.
-
PolarDB for MySQL memungkinkan Anda menggunakan spesifikasi berbeda untuk node yang berbeda dalam satu kluster yang sama. Anda dapat melakukan penskalaan naik atau turun node read-only IMCI secara independen. Kami merekomendasikan agar node read-only IMCI memiliki minimal CPU 8 core dan memori 16 GB.
PolarDB for MySQL 5.6/5.7: Apakah IMCI didukung?
Tidak. Fitur IMCI tidak didukung di PolarDB for MySQL 5.6 atau 5.7. Fitur ini hanya didukung di PolarDB for MySQL versi 8.0 dan yang lebih baru.
Batasan IMCI dan kompatibilitas MySQL
IMCI sepenuhnya kompatibel dengan sintaksis MySQL. Namun, beberapa fitur kueri yang kurang umum belum didukung sepenuhnya, seperti ekspresi tipe data spasial tertentu, full-text index, dan beberapa bentuk subkueri berkorelasi. Kueri yang menggunakan fitur-fitur tersebut tidak dapat dipercepat oleh IMCI dan secara otomatis akan kembali menggunakan row index standar. Untuk daftar lengkap batasan, lihat Batasan.
Menggunakan IMCI dengan INSERT/CREATE AS SELECT
IMCI hanya dapat digunakan untuk kueri pada node read-only, sedangkan pernyataan INSERT dan CREATE hanya dapat dieksekusi pada node primary. Oleh karena itu, untuk mempercepat bagian SELECT dalam pernyataan INSERT INTO SELECT atau CREATE TABLE AS SELECT, Anda harus menggunakan fitur ETL IMCI. Untuk informasi lebih lanjut, lihat Gunakan IMCI untuk mempercepat ETL.
Harga dan biaya
Fitur IMCI tidak dikenai biaya. Namun, untuk menggunakannya, Anda harus menambahkan node read-only khusus dengan IMCI yang diaktifkan. Anda akan dikenai biaya untuk node read-only baru tersebut serta penyimpanan tambahan yang dikonsumsi oleh IMCI.
Node read-only standar tidak mendukung IMCI.
Kebutuhan penyimpanan
IMCI menyimpan data dalam format kolom, memungkinkan rasio kompresi tinggi. Dibandingkan dengan penyimpanan berbasis baris, IMCI dapat mencapai rasio kompresi 3:1 hingga 10:1, biasanya menghasilkan jejak penyimpanan tambahan hanya sebesar 10% hingga 30% dari ukuran tabel asli.
Lihat penggunaan penyimpanan IMCI
-
Untuk versi kluster PolarDB for MySQL 8.0.1.1.32 dan sebelumnya, lakukan kueri terhadap tabel sistem
imci_columnsdiinformation_schemauntuk melihat ruang penyimpanan dan rasio kompresi tabel dengan IMCI. Misalnya, untuk memeriksa ruang penyimpanan dan rasio kompresi untuk tabel bernamatestdi databasetest, jalankan pernyataan SQL berikut:SELECT SCHEMA_NAME, TABLE_NAME, SUM(EXTENT_SIZE * TOTAL_EXTENT_COUNT) AS TOTAL_SIZE, SUM(EXTENT_SIZE * USED_EXTENT_COUNT) AS USED_SIZE, SUM(EXTENT_SIZE * FREE_EXTENT_COUNT) AS FREE_SIZE, SUM(RAW_DATA_SIZE) / SUM(FILE_SIZE) AS COMPRESS FROM information_schema.imci_columns WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test'; -
Untuk versi kluster PolarDB for MySQL 8.0.1.1.33 dan yang lebih baru, lakukan kueri terhadap tabel sistem
imci_data_filesdiinformation_schemauntuk melihat ruang penyimpanan dan tabel sistemimci_columnsuntuk melihat rasio kompresi. Misalnya, untuk memeriksa ruang penyimpanan dan rasio kompresi untuk tabel bernamatestdi databasetest, jalankan pernyataan SQL berikut:-
Lihat ruang penyimpanan yang digunakan oleh tabel
testdengan IMCI:SELECT SCHEMA_NAME, TABLE_NAME, SUM(EXTENT_SIZE * TOTAL_EXTENT_COUNT) AS TOTAL_SIZE, SUM(EXTENT_SIZE * USED_EXTENT_COUNT) AS USED_SIZE, SUM(EXTENT_SIZE * FREE_EXTENT_COUNT) AS FREE_SIZE FROM INFORMATION_SCHEMA.IMCI_DATA_FILES WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test'; -
Lihat rasio kompresi kolom:
SELECT SCHEMA_NAME, TABLE_NAME, SUM(RAW_DATA_SIZE) / SUM(CMP_DATA_SIZE) AS COMPRESS_RATIO FROM INFORMATION_SCHEMA.IMCI_COLUMNS WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test';
-
Tabel berikut menjelaskan parameter dalam pernyataan SQL di atas.
|
Parameter |
Deskripsi |
|
SCHEMA_NAME |
Nama database. |
|
TABLE_NAME |
Nama tabel. |
|
EXTENT_SIZE |
Ukuran extent, dalam byte. |
|
TOTAL_EXTENT_COUNT |
Jumlah total extent. |
|
USED_EXTENT_COUNT |
Jumlah extent yang digunakan. |
|
FREE_EXTENT_COUNT |
Jumlah extent bebas. |
|
RAW_DATA_SIZE |
Ukuran data kolom sebelum kompresi, dalam byte. |
|
FILE_SIZE |
Ukuran data kolom setelah kompresi, dalam byte. Catatan
Parameter ini berlaku untuk versi PolarDB for MySQL sebelum 8.0.1.1.33. |
|
CMP_DATA_SIZE |
Ukuran data kolom setelah kompresi, dalam byte. Catatan
Parameter ini berlaku untuk PolarDB for MySQL versi 8.0.1.1.33 dan yang lebih baru. |
Instant DDL dengan IMCI
-
Pada versi PolarDB for MySQL sebelum 8.0.1.1.42 dan 8.0.2.2.23, penambahan kolom ke tabel dengan IMCI tingkat tabel tidak menggunakan logika instant DDL karena operasi tersebut memerlukan perubahan struktur IMCI dan pembangunan ulang data indeks.
-
Pada PolarDB for MySQL versi 8.0.1.1.42 dan yang lebih baru, serta 8.0.2.2.23 dan yang lebih baru, instant DDL didukung untuk tabel dengan IMCI tingkat tabel. Fitur ini tidak kompatibel dengan mode rebuild pada versi sebelumnya. Anda harus mengatur parameter
imci_enable_add_column_instant_ddlke OFF dan memastikan tabel memiliki primary key.
Lihat atau hapus IMCI yang dibuat otomatis
SELECT * FROM information_schema.imci_autoindex_executed;
Proses penghapusan IMCI yang dibuat oleh autoindex sama dengan proses penghapusan IMCI yang dibuat secara manual:
ALTER TABLE t1 comment 'columnar=0';
Performa ALTER TABLE dengan IMCI
Menambahkan atau menghapus kolom biasanya melibatkan pembangunan ulang data tabel. Jika tabel memiliki IMCI, data IMCI juga harus dibangun ulang. Proses pembangunan ulang ini menulis ke log Redo. Karena IMCI sering kali mencakup banyak kolom, jumlah data log Redo yang dihasilkan sebanding dengan ukuran data tabel asli. Hal ini mengakibatkan volume I/O yang lebih tinggi dibandingkan dengan pembangunan ulang tabel tanpa IMCI, sehingga operasi membutuhkan waktu lebih lama.
Dampak terhadap performa write
Membuat IMCI memiliki dampak minimal terhadap performa write, biasanya kurang dari 5%. Pengujian Sysbench menggunakan oltp_insert workload menunjukkan penurunan performa sekitar 3% setelah IMCI dibuat.
Tingkat isolasi transaksi yang didukung
IMCI mendukung tingkat isolasi transaksi READ_COMMITTED dan REPEATABLE_READ.
-
Untuk menggunakan IMCI dengan tingkat isolasi transaksi
REPEATABLE_READ, Anda harus terhubung menggunakan titik akhir kustom yang hanya berisi node read-only IMCI. -
Pada versi PolarDB for MySQL 8.0.1.1.40 dan yang lebih baru, serta 8.0.2.2.21 dan yang lebih baru, beberapa tool ekosistem (seperti tool BI Metabase) mungkin secara implisit mengatur tingkat isolasi transaksi yang tidak didukung, seperti
READ_UNCOMMITTED. Dalam kasus tersebut, paksa penggunaanREAD_COMMITTEDdengan menjalankan perintahSET imci_ignore_unsupported_isolation_level=ON, atau tambahkan variabel sesi ke ODBC/JDBC. Misalnya, di Metabase, Anda dapat menambahkansession Variables=imci_ignore_unsupported_isolation_level='ON'ke .
Akselerasi kueri fuzzy
Ya. IMCI memberikan akselerasi luar biasa untuk kasus penggunaan kueri fuzzy dan mendukung operasi seperti LIKE PRUMER, NGRAM LIKE, dan SMID LIKE. Selain itu, fitur full-text index pada kolom juga memberikan akselerasi untuk kasus penggunaan kueri fuzzy.