Izinkan saya memberi Anda beberapa petunjuk berdasarkan pengetahuan dan pengalaman global saya:
Gunakan nama bidang yang lebih pendek
MongoDB menyimpan kunci yang sama untuk setiap dokumen. Pengulangan ini menyebabkan peningkatan ruang disk. Ini dapat memiliki beberapa masalah kinerja pada database yang sangat besar seperti milik Anda.
Kelebihan:
- Ukuran dokumen lebih kecil, ruang disk lebih sedikit
- Lebih banyak dokumen agar muat di RAM (lebih banyak cache)
- Ukuran indeks do akan lebih kecil dalam beberapa skenario
Kekurangan:
- Nama yang kurang mudah dibaca
Optimalkan ukuran indeks
Semakin kecil ukuran indeksnya, semakin sesuai dengan RAM dan semakin sedikit kesalahan indeks yang terjadi. Pertimbangkan hash SHA1 untuk git commit misalnya. Komit git berkali-kali diwakili oleh 5-6 karakter pertama. Kemudian cukup simpan 5-6 karakter alih-alih semua hash.
Pahami faktor bantalan
Untuk pembaruan yang terjadi di dokumen menyebabkan pemindahan dokumen mahal. Pemindahan dokumen ini menyebabkan penghapusan dokumen lama dan memperbaruinya ke lokasi baru yang kosong dan memperbarui indeks yang memakan biaya.
Kita perlu memastikan dokumen tidak bergerak jika terjadi pembaruan. Untuk setiap koleksi ada faktor pengisi yang memberi tahu, selama penyisipan dokumen, berapa banyak ruang ekstra yang harus dialokasikan selain dari ukuran dokumen sebenarnya.
Anda dapat melihat faktor padding koleksi menggunakan:
db.collection.stats().paddingFactor
Tambahkan bantalan secara manual
Dalam kasus Anda, Anda cukup yakin untuk memulai dengan dokumen kecil yang akan tumbuh. Memperbarui dokumen Anda setelah beberapa saat akan menyebabkan beberapa pemindahan dokumen. Jadi lebih baik menambahkan padding untuk dokumen. Sayangnya, tidak ada cara mudah untuk menambahkan padding. Kita dapat melakukannya dengan menambahkan beberapa byte acak ke beberapa kunci saat melakukan penyisipan dan kemudian menghapus kunci itu di kueri pembaruan berikutnya.
Terakhir, jika Anda yakin bahwa beberapa kunci akan masuk ke dokumen di masa mendatang, maka alokasikan terlebih dahulu kunci tersebut dengan beberapa nilai default sehingga pembaruan lebih lanjut tidak menyebabkan pertumbuhan ukuran dokumen yang menyebabkan pemindahan dokumen.
Anda bisa mendapatkan detail tentang kueri yang menyebabkan pemindahan dokumen:
db.system.profile.find({ moved: { $exists : true } })
Sejumlah besar koleksi VS sejumlah besar dokumen dalam sedikit koleksi
Skema adalah sesuatu yang tergantung pada persyaratan aplikasi. Jika ada koleksi besar di mana kami hanya meminta data N hari terakhir, maka kami dapat memilih untuk memiliki koleksi terpisah dan data lama dapat diarsipkan dengan aman. Ini akan memastikan bahwa caching di RAM dilakukan dengan benar.
Setiap koleksi yang dibuat dikenakan biaya yang lebih besar daripada biaya pembuatan koleksi. Setiap koleksi memiliki ukuran minimum yaitu beberapa KB + satu indeks (8 KB). Setiap koleksi memiliki namespace yang terkait, secara default kami memiliki beberapa namespace 24K. Misalnya, memiliki koleksi per Pengguna adalah pilihan yang buruk karena tidak dapat diskalakan. Setelah beberapa saat, Mongo tidak mengizinkan kami membuat koleksi indeks baru.
Umumnya memiliki banyak koleksi tidak memiliki penalti kinerja yang signifikan. Misalnya, kita dapat memilih untuk memiliki satu koleksi per bulan, jika kita tahu bahwa kita selalu melakukan kueri berdasarkan bulan.
Denormalisasi data
Selalu disarankan untuk menyimpan semua data terkait untuk kueri atau urutan kueri di lokasi disk yang sama. Anda sesuatu yang perlu untuk menduplikasi informasi di dokumen yang berbeda. Misalnya, dalam postingan blog, Anda ingin menyimpan komentar postingan di dalam dokumen postingan.
Kelebihan:
- ukuran indeks akan sangat berkurang karena jumlah entri indeks akan lebih sedikit
- kueri akan sangat cepat termasuk mengambil semua detail yang diperlukan
- ukuran dokumen akan sebanding dengan ukuran halaman yang berarti ketika kami membawa data ini ke dalam RAM, sebagian besar waktu kami tidak membawa data lain di sepanjang halaman
- pemindahan dokumen akan memastikan bahwa kita membebaskan sebuah halaman, bukan potongan kecil kecil di halaman yang mungkin tidak digunakan dalam penyisipan lebih lanjut
Koleksi yang Dibatasi
Koleksi yang dibatasi berperilaku seperti buffer melingkar. Mereka adalah tipe khusus dari koleksi ukuran tetap. Koleksi ini dapat menerima penulisan dan pembacaan berurutan dengan kecepatan sangat tinggi. Menjadi ukuran tetap, setelah ruang yang dialokasikan terisi, dokumen baru ditulis dengan menghapus yang lama. Namun pembaruan dokumen hanya diperbolehkan jika dokumen yang diperbarui sesuai dengan ukuran dokumen asli (mainkan dengan bantalan untuk lebih fleksibel).