Buka konsol
Coba Cloud Firestore: Lihat database yang skalabel dan fleksibel dari Firebase dan Google Cloud Platform. Pelajari Cloud Firestore lebih lanjut.

Mengoptimalkan Performa Database

Ada beberapa cara untuk meningkatkan performa Firebase Realtime Database di aplikasi Anda. Untuk mencari tahu apa yang dapat Anda lakukan untuk mengoptimalkan performa Realtime Database, kumpulkan data melalui beberapa fitur pemantauan Realtime Database yang berbeda, lalu lakukan perubahan yang diperlukan pada aplikasi atau penggunaan Realtime Database Anda.

Memantau performa Realtime Database

Anda dapat mengumpulkan data mengenai performa Realtime Database melalui sejumlah fitur yang berbeda, tergantung pada tingkat perincian yang Anda perlukan:

  • Ringkasan tingkat tinggi: Gunakan fitur profiler untuk melihat daftar kueri yang tidak diindeks dan ringkasan real-time operasi baca/tulis.
  • Estimasi penggunaan yang ditagihkan: Gunakan metrik penggunaan yang tersedia di Firebase console untuk melihat metrik performa tingkat tinggi dan penggunaan yang ditagihkan.
  • Tampilan data terperinci: Gunakan Stackdriver Monitoring untuk melihat tampilan yang lebih terperinci mengenai performa database Anda dari waktu ke waktu.

Meningkatkan performa berdasarkan metrik

Setelah mengumpulkan data, cobalah tips berikut berdasarkan area performa yang ingin Anda tingkatkan.

Sekilas tentang strategi peningkatan performa
Metrik Deskripsi Tips
Beban/Penggunaan Optimalkan jumlah kapasitas database yang digunakan dalam pemrosesan permintaan, kapan pun hal itu dilakukan (tergambar dalam metrik **Load** atau **io/database_load**). Optimalkan struktur data Anda
Lakukan sharding data di semua database
Tingkatkan efisiensi listener
Batasi download dengan aturan berbasis kueri
Optimalkan koneksi
Koneksi aktif Seimbangkan jumlah koneksi simultan aktif dengan database Anda agar tetap di bawah batasan 100.000 koneksi. Lakukan sharding data di semua database
Kurangi koneksi baru
Bandwidth keluar Jika download dari database Anda terlihat lebih tinggi dari seharusnya, Anda dapat meningkatkan efisiensi operasi baca Anda dan mengurangi jumlah overhead enkripsi. Optimalkan koneksi
Optimalkan struktur data Anda
Batasi download dengan aturan berbasis kueri
Gunakan kembali sesi SSL
Tingkatkan efisiensi listener
Batasi akses ke data
Penyimpanan Pastikan Anda tidak menyimpan data yang tidak digunakan atau seimbangkan data yang Anda simpan di semua database dan/atau produk Firebase agar tetap di bawah kuota. Bersihkan data yang tidak digunakan
Optimalkan struktur data Anda
Lakukan sharding data di semua database
Gunakan Firebase Storage

Mengoptimalkan koneksi

Permintaan RESTful, seperti GET dan PUT, masih memerlukan koneksi, meskipun koneksi tersebut tidak tersambung lama. Koneksi yang sering dan tidak lama ini dapat meningkatkan biaya koneksi, beban database, dan bandwidth keluar secara signifikan dibandingkan koneksi realtime aktif ke database Anda.

Kapan pun memungkinkan, gunakan SDK native untuk platform aplikasi Anda, bukan REST API. SDK akan mempertahankan penggunaan koneksi bebas, sehingga mengurangi biaya enkripsi SSL dan beban database yang dapat bertambah di REST API.

Jika Anda menggunakan REST API, pertimbangkan menggunakan HTTP keep-alive agar tetap dapat menggunakan koneksi bebas atau menggunakan peristiwa terkirim ke server yang dapat mengurangi biaya handshake SSL.

Melakukan sharding data di lebih dari satu database

Membagi data di lebih dari satu instance Realtime Database, atau yang dikenal dengan sharding database, memiliki tiga keuntungan:

  1. Meningkatkan total koneksi simultan aktif yang diizinkan di aplikasi Anda dengan membaginya di semua instance database.
  2. Menyimbangkan beban di semua instance database.
  3. Jika Anda memiliki kelompok pengguna independen yang hanya perlu mengakses kumpulan data terpisah, gunakan instance database berbeda untuk throughput yang lebih tinggi dan latensi yang lebih rendah.

Jika Anda menggunakan paket harga Blaze, Anda dapat membuat beberapa instance database di project Firebase yang sama dengan menggunakan metode autentikasi pengguna umum di semua instance database.

Pelajari lebih lanjut cara dan kapan sharding data sebaiknya dilakukan.

Membuat struktur data yang efisien

Karena Realtime Database mengambil data dari node turunan suatu lokasi dan dari lokasi itu sendiri, pastikan struktur data Anda serata mungkin. Dengan demikian, Anda dapat mengambil data yang Anda perlukan secara selektif, tanpa perlu mendownload data yang tidak diperlukan oleh klien.

Khususnya, pertimbangkan untuk menulis dan menghapus saat Anda sedang membuat struktur data Anda. Misalnya, lokasi yang memiliki ribuan cabang berpotensi memerlukan biaya yang tinggi jika dihapus. Membaginya ke dalam beberapa lokasi yang memiliki sub-hierarki dan lebih sedikit cabang per node bisa mempercepat penghapusan.

Selain itu, setiap penulisan bisa menggunakan hingga 0,1% dari total penggunaan database Anda. Atur struktur data Anda dengan cara yang memungkinkan Anda mengelompokkan penulisan ke dalam satu operasi sebagai update multilokasi melalui metode update() di permintaan PATCH RESTful atau SDK.

Untuk mengoptimalkan struktur data dan meningkatkan kinerja, ikuti tips seputar struktur data.

Mencegah akses tanpa izin

Cegah operasi tanpa izin di database Anda dengan Aturan Realtime Database. Misalnya, penggunaan aturan dapat menghindari skenario di mana pengguna yang berbahaya mampu mendownload seluruh database Anda berulang kali.

Pelajari lebih lanjut cara menggunakan Aturan Firebase Realtime Database.

Menggunakan aturan berbasis kueri untuk membatasi download

Aturan Realtime Database membatasi akses ke data di database Anda, serta dapat berfungsi sebagai pembatas untuk data yang ditampilkan melalui operasi baca. Jika Anda menggunakan aturan berbasis kueri, seperti yang ditetapkan oleh ekspresi query. seperti query.limitToFirst, kueri hanya mengambil data yang dibatasi oleh aturan.

Misalnya, aturan berikut membatasi akses baca hanya untuk 1.000 hasil kueri pertama, yang diurutkan berdasarkan prioritas:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Pelajari Aturan Realtime Database lebih lanjut.

Tambahkan pengindeksan pada kueri

Dengan mengindeks data, jumlah bandwidth yang digunakan setiap kueri yang dijalankan oleh aplikasi Anda akan berkurang.

Menggunakan kembali sesi SSL

Kurangi biaya overhead enkripsi SSL pada koneksi yang dilanjutkan dengan membuat tiket sesi TLS. Ini sangat membantu jika Anda memerlukan koneksi rutin dan aman ke database.

Meningkatkan efisiensi listener

Letakkan listener Anda pada lokasi sebawah mungkin agar Anda dapat membatasi jumlah data yang disinkronkan. Listener Anda harus dekat dengan data yang perlu mereka dapatkan. Jangan letakkan listener di root database karena akan menyebabkan seluruh database Anda terdownload.

Tambahkan kueri untuk membatasi data yang dihasilkan oleh operasi listen dan gunakan listener yang hanya mendownload update ke data — misalnya on() bukan once(). Simpan .once() untuk tindakan yang benar-benar tidak memerlukan update data. Selain itu, urutkan kueri Anda menggunakan orderByKey() kapan pun memungkinkan demi mendapatkan kinerja terbaik. Pengurutan menggunakan orderByChild() bisa 6-8 kali lebih lambat, dan pengurutan dengan orderByValue() bisa sangat lambat untuk kumpulan data berukuran besar karena harus membaca seluruh lokasi dari lapisan persistensi.

Pastikan juga Anda menambahkan listener secara dinamis dan menghapusnya jika sudah tidak diperlukan.

Membersihkan data yang tidak terpakai

Hapus setiap data duplikat atau yang tidak terpakai secara berkala di database Anda. Anda dapat menjalankan backup untuk memeriksa data secara manual atau melakukan backup secara berkala ke bucket Google Cloud Storage. Pertimbangkan juga untuk menghosting data yang disimpan melalui Firebase Storage.

Mengirimkan kode yang dapat diskalakan dan diupdate

Aplikasi yang terpasang di perangkat IoT harus menyertakan kode yang dapat Anda skalakan dan update dengan mudah. Pastikan Anda menguji kasus penggunaan secara menyeluruh, mempertimbangkan skenario yang dapat mengembangkan basis pengguna Anda secara eksponensial, dan menyediakan kemampuan untuk menerapkan update ke kode Anda. Pertimbangkan perubahan penting yang mungkin perlu Anda lakukan nanti, seandainya Anda memutuskan untuk melakukan sharding data.