In-Memory Column Index (IMCI) menambahkan penyimpanan kolom dan lapisan komputasi dalam memori ke PolarDB for MySQL, memungkinkan pemrosesan transaksional dan analitik hibrida (HTAP) pada satu kluster tanpa mengorbankan kinerja OLTP atau melakukan migrasi data.
Mengapa MySQL membutuhkan penyimpanan kolom
MySQL dirancang untuk online transaction processing (OLTP): pencarian baris tunggal, penulisan konkuren, dan transaksi berlatensi rendah. Seiring kluster PolarDB secara rutin menyimpan ratusan terabyte data, pengguna semakin membutuhkan analitik real-time pada data yang sama yang mendorong aplikasi mereka. Tiga pendekatan arsitektur telah muncul.
MySQL + database AP khusus
Terapkan dua sistem terpisah — MySQL untuk OLTP dan database OLAP khusus untuk analitik — dengan pipeline sinkronisasi di antara keduanya. Anda mendapatkan mesin terbaik untuk setiap workload, tetapi biayanya tinggi: dua tumpukan teknologi yang harus dikelola, latensi sinkronisasi yang membuat data analitik tidak mutakhir, dan tidak ada jalur langsung menuju konsistensi real-time.

Desain divergen multi-replika
Database NewSQL terdistribusi seperti TiDB (mulai versi 4.0) menetapkan format penyimpanan berbeda untuk replika berbeda dalam setiap grup Raft. Satu replika menjalankan TiFlash, yaitu penyimpanan kolom, untuk melayani kueri analitik; replika lainnya menangani OLTP. Perutean kueri cerdas memilih replika yang tepat secara otomatis. Pendekatan ini bekerja baik untuk penerapan baru tetapi memerlukan migrasi dari MySQL, yang menimbulkan masalah kompatibilitas.

Penyimpanan hibrida baris-kolom terintegrasi
Pendekatan paling canggih menyimpan data berorientasi baris dan berorientasi kolom dalam satu instansiasi basis data. Semua database komersial utama menggunakan desain ini:
Oracle memperkenalkan suite Database In-Memory di Oracle Database 12c (2013), menggunakan penyimpanan kolom dalam memori dengan eksekusi hibrida baris-kolom dan optimasi kueri berbasis ekspresi materialisasi serta JoinGroup.
SQL Server menambahkan indeks penyimpanan kolom di SQL Server 2016 SP1, mendukung tabel berorientasi baris, tabel berorientasi kolom, dan kombinasi hibrida.
IBM Db2 meluncurkan BLU Acceleration di Kepler 10.5 (2013), menggabungkan penyimpanan kolom, komputasi dalam memori, dan data skipping.

Ketiganya mengadopsi desain ini karena alasan yang sama: penyimpanan kolom memberikan efisiensi I/O yang lebih baik (kompresi, data skipping, pemangkasan kolom) dan efisiensi CPU yang lebih baik (pola akses ramah cache). Namun, indeks penyimpanan kolom bersifat sparse — tidak dapat menemukan baris individual secara efisien seperti indeks B+ tree. Mesin hibrida baris-kolom mengatasi hal ini: penyimpanan baris menangani OLTP dengan pengindeksan tingkat baris yang presisi, sedangkan penyimpanan kolom mempercepat pemindaian analitik massal. Latensi rendah DRAM mengimbangi kesenjangan kinerja dalam pembaruan penyimpanan kolom.
Mengapa PolarDB membutuhkan mesin eksekusi baru
Tumpukan kemampuan PolarDB mencerminkan MySQL open source. Meskipun PolarDB menangani OLTP secara efisien dan mendukung hingga 500 TB data per kluster, kueri analitik kompleks tetap lambat. Hambatan ini bersifat mendasar dalam arsitektur MySQL:
Model eksekusi serial. Model iterator volcano MySQL memproses satu baris dalam satu waktu. Setiap pengambilan baris memicu beberapa lapisan pemanggilan fungsi, termasuk dispatch fungsi virtual. Hal ini merusak efisiensi pipeline CPU dan mencegah penggunaan instruksi SIMD.
Tidak ada kueri paralel. Executor MySQL bersifat single-threaded. Dukungan kueri paralel di MySQL 8.0 hanya mencakup operasi dasar seperti
COUNT(*); SQL analitik kompleks tetap berjalan secara serial terlepas dari jumlah core CPU yang tersedia.Pemborosan I/O penyimpanan baris. Ketika kueri analitik hanya membutuhkan 3 kolom dari tabel berisi 50 kolom, MySQL tetap membaca semua 50 kolom dari disk. Format penyimpanan baris membuat akses selektif kolom secara inheren tidak efisien.
Kerangka kerja kueri paralel PolarDB mengatasi bottleneck CPU dengan mendistribusikan pekerjaan pemindaian ke beberapa thread dan mengagregasi hasil di thread utama:

Kueri paralel menghilangkan batas single-core dan mengurangi waktu kueri untuk workload yang intensif pemindaian. Namun, inefisiensi I/O penyimpanan baris menciptakan batas yang tidak dapat diatasi hanya dengan eksekusi paralel. Menghilangkan batas tersebut memerlukan penyimpanan kolom.
Penyimpanan kolom meningkatkan kinerja pada dua level:
Efisiensi I/O. Kueri hanya membaca kolom yang dibutuhkan. Data kolom dikompresi dengan efisiensi lebih dari 10x dibandingkan penyimpanan baris. Dikombinasikan dengan indeks kasar (statistik MIN/MAX per blok data), blok data besar yang tidak relevan dapat dilewati sebelum dekompresi. Dalam arsitektur compute-storage terpisah PolarDB, transfer data yang lebih sedikit melalui jaringan langsung berarti respons kueri lebih cepat.
Efisiensi CPU. Data kolom disimpan secara berurutan, yang meningkatkan tingkat hit cache CPU dan mengurangi stall akibat cache miss L1/L2. Data kolom berurutan juga memungkinkan vektorisasi SIMD, melipatgandakan throughput single-core.
Istilah kunci
| Term | Definisi |
|---|---|
| IMCI | In-Memory Column Index. Implementasi PolarDB atas penyimpanan hibrida baris-kolom. |
| Indeks kolom | Indeks sekunder di InnoDB yang menyimpan data kolom dalam format kolom, bukan format baris. |
| Grup baris | Unit organisasi data dalam indeks kolom. Setiap grup baris menampung 64.000 baris. |
| Paket data | Data satu kolom dalam satu grup baris, disimpan secara berurutan dan dikompresi. |
| Indeks kasar | Statistik yang telah dihitung sebelumnya (MIN, MAX, SUM, jumlah null, jumlah baris) untuk setiap paket data, digunakan untuk melewati paket data yang tidak relevan tanpa perlu dekompresi. |
| Area Penyimpanan Kolom dalam Memori | Wilayah memori tempat paket data aktif di-cache untuk eksekusi kueri. Data kolom dikompresi di disk dan di-cache di sini. |
| Degree of parallelism (DOP) | Jumlah thread paralel yang digunakan untuk mengeksekusi kueri. Auto DOP memilih nilai ini secara otomatis berdasarkan sumber daya sistem. |
| Volcano model | Model eksekusi kueri di mana setiap operator mengekspos antarmuka Next(), menarik data dari operator anak satu baris (atau batch) dalam satu waktu. |
| Eksekusi vektorisasi | Varian model volcano di mana setiap pemanggilan Next() mengembalikan batch baris, bukan satu baris, sehingga memungkinkan akselerasi SIMD. |
Cara kerja IMCI
IMCI menggabungkan empat inovasi teknis:
Indeks kolom di InnoDB. Buat indeks kolom pada kolom tertentu menggunakan pernyataan DDL. Indeks kolom menggunakan penyimpanan terkompresi per kolom — jauh lebih kecil daripada penyimpanan baris — dan secara default berada di Area Penyimpanan Kolom dalam Memori. Jika memori tidak mencukupi, data akan dialihkan ke penyimpanan bersama.
Mesin eksekusi berorientasi kolom. Executor PolarDB mengakses data dalam batch berisi 4.096 baris dan menerapkan instruksi SIMD untuk memproses beberapa nilai dalam satu operasi CPU. Semua operator utama (Scan, Hash Join, Nested Loop Join, Group By) mendukung eksekusi paralel. Dibandingkan executor baris MySQL, executor kolom memberikan kinerja beberapa orde lebih tinggi pada workload analitik.
Pengoptimal hibrida baris-kolom. Saat kueri diajukan, pengoptimal mengevaluasi biaya tiga jalur eksekusi — eksekusi serial penyimpanan baris, kueri paralel penyimpanan baris, dan IMCI — lalu memilih rencana dengan biaya terendah. Mekanisme daftar putih memastikan bahwa kueri yang menggunakan tipe kolom atau operator yang tidak didukung secara otomatis kembali ke penyimpanan baris, menjaga kompatibilitas MySQL 100%.
Isolasi workload AP/TP. Konfigurasikan node read-only (RO) khusus sebagai node analitik dengan indeks kolom. Kueri analitik dijalankan di node RO menggunakan seluruh CPU dan memori yang tersedia, tanpa berdampak pada workload OLTP yang berjalan di node read/write (RW).

Arsitektur teknis
Pengoptimal hibrida baris-kolom
Mesin eksekusi berorientasi kolom
Mesin eksekusi IMCI merupakan penulisan ulang lengkap, independen dari executor baris MySQL. Tujuannya adalah menghilangkan dua bottleneck mendasar: overhead fungsi virtual per baris dan ketidakmampuan memparalelkan eksekusi.
Executor paralel vektorisasi
Sistem ekspresi vektorisasi
Penyimpanan hibrida baris-kolom
Kinerja OLAP
Untuk hasil benchmark, lihat Kinerja IMCI.











