Readyset Mencapai Peningkatan Performa 450x dengan Index Condition Pushdown untuk Database Joins

Tim Komunitas BigGo
Readyset Mencapai Peningkatan Performa 450x dengan Index Condition Pushdown untuk Database Joins

Optimisasi performa database terus menjadi tantangan kritis untuk aplikasi modern, terutama ketika menangani operasi join yang kompleks. Readyset , sebuah lapisan caching yang dirancang untuk latensi query sub-milidetik, baru-baru ini mengatasi bottleneck signifikan dalam sistem mereka: straddled joins selama cache miss. Join ini melibatkan filtering predicates di kedua sisi operasi join, menciptakan tantangan performa yang sulit dipecahkan secara efektif oleh pendekatan optimisasi tradisional.

Mengoptimalkan performa database di Readyset, mengatasi tantangan dengan straddled joins
Mengoptimalkan performa database di Readyset, mengatasi tantangan dengan straddled joins

Akar Masalah: Pembacaan Data yang Berlebihan

Investigasi performa mengungkap penyebab yang mengejutkan. Awalnya, para engineer menduga kompresi data adalah bottleneck-nya, karena profiling menunjukkan 30% waktu eksekusi dihabiskan untuk dekompresi. Namun, mengganti algoritma kompresi hanya memindahkan masalah ke saturasi disk I/O. Masalah sebenarnya adalah jumlah data yang tidak perlu dibaca dari storage dalam jumlah besar.

Dalam straddled joins dengan selektivitas yang tidak merata, pendekatan hash join lama akan mengevaluasi kedua sisi join secara independen. Ini berarti membaca hampir seluruh tabel bahkan ketika satu sisi memiliki kondisi yang sangat selektif. Misalnya, mencari satu user berdasarkan email sambil juga memfilter 90% pesanan berdasarkan status menghasilkan materialisasi jutaan baris yang tidak perlu yang akan dibuang setelah operasi join.

Pengurangan I/O: Pendekatan sebelumnya memerlukan ~10K IOPS dengan 80% utilisasi perangkat untuk kueri tunggal

Index Condition Pushdown: Pendekatan yang Lebih Cerdas

Solusinya datang melalui implementasi Index Condition Pushdown (ICP), yang secara fundamental mengubah cara join ini dieksekusi. Alih-alih memfilter kedua sisi secara independen, pendekatan baru pertama-tama mengevaluasi sisi yang lebih selektif, kemudian menggunakan hasil tersebut untuk membangun pencarian yang ditargetkan untuk sisi lainnya.

Strategi ini memanfaatkan compound indexes secara efektif. Ketika mencari pesanan dengan status tertentu yang dimiliki oleh user tertentu, sistem sekarang dapat menggunakan index pada kolom user_id dan status untuk mengambil hanya baris yang relevan. Ini menghilangkan kebutuhan untuk memindai sebagian besar tabel dan secara dramatis mengurangi penggunaan memori.

Optimasi Memori: Menghilangkan kebutuhan untuk mematerialisasi jutaan baris yang akan dibuang setelah joins

Pengakuan Komunitas dan Implementasi Serupa

Komunitas database telah mengakui pola optimisasi ini di berbagai sistem. Database engine lain telah mengimplementasikan pendekatan serupa, dengan beberapa melaporkan peningkatan performa yang sebanding - dari query 6 detik turun menjadi 50 milidetik. Teknik ini telah diadopsi dengan berbagai nama, termasuk pushdown joins di beberapa sistem, meskipun konsep intinya tetap konsisten di seluruh implementasi.

Kami juga berhasil dari sekitar 6 detik menjadi 50ms. Peningkatan yang luar biasa.

Beberapa developer telah mencatat bahwa meskipun terminologi mungkin berbeda antar sistem, prinsip optimisasi fundamental untuk mengurangi pergerakan data yang tidak perlu dan memanfaatkan indexes secara lebih efektif menjadi pendekatan standar untuk menangani skenario join yang kompleks.

Peningkatan Performa: Percepatan hingga 450x untuk query straddled join

Dampak di Dunia Nyata

Optimisasi ini mengatasi skenario produksi umum di mana aplikasi perlu memfilter data di beberapa tabel yang terkait. Platform e-commerce, misalnya, sering perlu menemukan user dengan atribut tertentu dan pesanan mereka yang sesuai dengan kriteria tertentu. Pendekatan sebelumnya akan membaca data yang tidak relevan dalam jumlah besar, sementara metode baru secara tepat menargetkan hanya record yang diperlukan.

Peningkatan ini sangat berharga untuk sistem yang menangani workload volume tinggi di mana bahkan inefisiensi kecil dapat berkembang menjadi masalah performa yang signifikan. Dengan mengurangi operasi I/O dan penggunaan memori, optimisasi ini tidak hanya meningkatkan kecepatan query tetapi juga mengurangi konsumsi sumber daya sistem secara keseluruhan.

Referensi: Optimizing Straddled Joins in Readyset: From Hash Joins to Index Condition Pushdown