Mengenal Compound Index Pada MongoDB
Compound index adalah salah satu fitur tingkat lanjut dari MongoDB yang digunakan untuk mencari atau mengurutkan data berdasarkan dua atau lebih field. Dengan kita menentukan compound index secara tepat, maka akan berpotensi meningkatkan covered query. Covered query adalah istilah untuk query yang dilakukan hanya menggunakan indeks tanpa perlu membaca keseluruhan dokumen. Dengan adanya covered query ini maka performa pencarian MongoDB akan meningkat.
Contoh implementasi Compound Index
Ketika kita memiliki sebuah collection marketplace, yang mempunyai beberapa field, seperti id, nama, type, harga, status
. Ketika kita ingin mencari barang dengan type
A, maka akan kita jalankan query berikut.
db.marketplace.find({type:A})
Dalam contoh tersebut kita hanya perlu mengindeks field type
. Namun, ketika kita akan melakukan query baru untuk mencari barang type
A dengan status tersedia, maka kita akan menjalankan query berikut.
db.marketplace.find({type:"A", status:"tersedia"})
Dalam contoh ini, kita tidak cukup untuk mengindeks field type
, tapi juga perlu mengindeks field status
. Pada saat seperti ini lah kita membutuhkan compound index.
Mengaplikasikan ESR (Equality, Sort, Range) Rule
ESR (Equality, Sort, Range) rule merupakan salah satu cara pembentukan compound index yang disarankan, karena dapat meningkatkan efisiensi query MongoDB. Jika mengikuti ESR rule, kita akan mengurutkan field indeks dengan menjadikan indeks yang digunakan untuk pencarian pada urutan indeks pertama. Setelah itu field yang digunakan untuk pengurutan. Selanjutnya field yang digunakan untuk mencari data berupa range value.
Salah satu contoh pengaplikasiannya adalah ketika kita memiliki collection marketplace, dan kita ingin mencari data dengan type
A, harga lebih dari Rp10.000, dan diurutkan berdasarkan jumlah stok secara descending. Berikut adalah bentuk querynya.
db.marketplace.find({type: "A", harga: {$gt: 10000}}).sort({stock: -1})
Dengan melihat contoh query di atas, kita bisa melihat field type
digunakan untuk pencarian, field harga
digunakan untuk pencarian menggunakan range value, dan field stock
untuk mengurutkan data. Berdasarkan informasi tersebut kita dapat menyusun compound indeks berdasarkan ESR rule, berikut adalah hasilnya.
db.marketplace.createIndex({type: 1, stock: 1, price: 1})
Optimalisasi indeks dengan memanfaatkan Prefix Index
Selain menggunakan ESR rule, terdapat cara lain untuk menyusun field compound index, salah satunya yaitu memanfaatkan prefix index. Prefix index adalah pemanfaatkan potongan awalan compound index yang bisa dipakai untuk meng-cover indeks yang lain. Misalkan kita memiliki indeks sebagai berikut.
db.marketplace.createIndex({type: 1, stock: 1, price: 1})
{type: 1}
{type: 1, stock: 1}
Maka dapat kita simpulkan, indeks yang kita punya dapat digunakan untuk pencarian type
saja atau pencarian type
dengan stock
. Tapi mungkin muncul pertanyaan, bagaimana dengan pencarian hanya type
dan price
?. Jawabannya adalah pencarian tersebut tidak dapat menggunakan indeks yang sudah kita buat, karena type
dan price
tidak termasuk prefix index.
Sebelum membuat indeks, kita perlu mencatat kemungkinan query yang akan ditemui dalam aplikasi. Setelah mencatat query, kita bisa mengelompokkannya berdasarkan prefix index. Dengan begitu kita bisa membuat indeks dengan jumlah minimal tapi memiliki covered query yang tinggi.
Contoh, ketika kita memiliki daftar query sebagai berikut.
db.marketplace.find({type: "a"})
db.marketplace.find({type: "a"}).sort({stock: 1})
db.marketplace.find({type: "a", stock: {$gt: 1}})
db.marketplace.find({stock: 2})
db.marketplace.find({stock: {$gt: 1}, price:{$lte: 1000000}})
db.marketplace.find(
{stock: {$gt: 1}, price:{$lte: 1000000}, type:"a"}).sort({stock: 1}
)
Untuk meng-cover semua query di atas, kita tidak perlu membuat indeks sebagai berikut.
{type:1}
{type:1, stock:1}
{stock:1}
{stock:1, price:1}
{stock:1, price:1, type:1}
Kita hanya perlu membuat index sebagai berikut
{type:1, stock:1, price:1}
{stock:1, price:1}
Dengan mengetahui prefix index, kita bisa menghemat jumlah indeks dan dengan begitu bisa menghemat disk space untuk menyimpan indeks.