info@solusidb.com

MongoDB best practices – 2. Schema design best practices

Image Source: https://docs.mongodb.com/manual/core/data-modeling-introduction/

Mongodb adalah schema less tidak seperti DBMS yang memiliki struktur table. Yang dilakukan terhadap mongodb adalah hanya membuat collections dan Indexing. Berikut beberapa tipsnya:

Use the appropriate storage engine
Pada mongodb memiliki storage engine berupa WiredTiger (mulai mongodb 3.2) , MMAPv1 (di remove pada versi 4.2) dan In-Memory Storage Engine (pada mongodb enterprise).

Indexing Early
Pada saat kita membuat collections & query, tentukan index yang akan digunakan, Jangan menunggu sampai terjadi masalah di Productions baru melakukan indexing. Proses analisa query untuk kebutuhan index ini dapat terbantu oleh tools monitoring seperti MMS atau dengan menganalisa log mongodb.

Eliminate unnecessary indexes
Terlalu banyak index juga akan mempengaruhi performa proses penulisan, karena index menggunakan resource dari RAM dan I/O. Maka kita harus tau mana index yang memang digunakan dan mana yang tidak digunakan, jika index tersebut tidak digunakan, maka sebaiknya dihilangkan saja.

Use a compound index, rather than index intersection
Query dengan multiple conditions (A dan B, C atau D dan E, dan seterusnya) akan lebih baik menggunakan satu compound index dibanding dengan menggunakan multiple index satu per satu. Keuntungan lainnya dari compound index adalah dapat digunakan jika kita memakai query dengan kondisi A, (A,B), (A,B,C). Tetapi tidak bisa digunakan untuk query dengan kondisi (B,C) atau (C).

Low selectivity indexes
Contohnya adalah indexing berdasarkan field Gender akan lebih baik jika dibandingkan dengan indexing berdasarkan Lastname.

Avoid negation in queries
Indexing adalah value kolom yang di index, bukan untuk untuk value yang tidak ada, Jadi menggunakan NOT pada query, tidak dapat menggunakan index yang telah dibuat.

Use partial indexes
Partial index ini hanya mengindeks dokumen dalam collections yang memenuhi kriteria filter tertentu, Dengan menggunakan partial index kita dapat menghemat cost storage penyimpanan, dan performance cost pada saat pembuatan index. Berikut adalah contoh partial index untuk kasus hanya dokumen yang memiliki rating lebih besar dari 5.

db.restaurants.createIndex(
{ cuisine: 1, name: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)