Mengelola indeks
Firestore memastikan performa kueri dengan mewajibkan indeks untuk setiap kueri. Indeks yang diperlukan untuk kueri paling dasar dibuat otomatis untuk Anda. Saat Anda menggunakan dan menguji aplikasi, Cloud Firestore membuat pesan error yang membantu Anda membuat indeks tambahan yang dibutuhkan aplikasi. Halaman ini menjelaskan cara mengelola indeks kolom tunggal dan gabungan.
Membuat indeks yang hilang melalui pesan error
Jika Anda mencoba kueri gabungan dengan klausa rentang yang tidak memetakan ke indeks yang ada, Anda akan menerima error. Pesan error menyertakan link langsung untuk membuat indeks yang tidak ada di Firebase console.
Ikuti link yang dihasilkan untuk membuka Firebase console, tinjau info yang terisi secara otomatis, lalu klik Buat.
Peran dan izin
Sebelum dapat membuat indeks di Firestore, pastikan Anda ditunjuk untuk salah satu peran berikut:
roles/datastore.owner
roles/datastore.indexAdmin
roles/editor
roles/owner
Jika Anda telah menentukan peran khusus, tetapkan semua izin berikut untuk membuat indeks:
datastore.indexes.create
datastore.indexes.delete
datastore.indexes.get
datastore.indexes.list
datastore.indexes.update
Menggunakan Google Cloud Platform Console
Dari Google Cloud Platform Console, Anda dapat mengelola pengecualian pengindeksan kolom tunggal dan indeks komposit.
Buat indeks gabungan
Untuk membuat indeks komposit baru secara manual dari GCP Console:
Di konsol Google Cloud, buka halaman Databases.
Pilih database yang diperlukan dari daftar database.
Di menu navigasi, klik Indexes, lalu klik tab Composite.
Klik Buat Indeks.
Masukkan ID Koleksi. Tambahkan nama kolom yang ingin Anda indeks dan mode indeks untuk setiap kolom. Klik Simpan Indeks.
Indeks baru Anda akan muncul dalam daftar indeks komposit dan Firestore akan mulai membuat indeks Anda. Ketika indeks selesai dibuat, Anda akan melihat tanda centang hijau di samping indeks.
Menghapus indeks komposit
Untuk menghapus indeks komposit:
Di konsol Google Cloud, buka halaman Databases.
Pilih database yang diperlukan dari daftar database.
Di menu navigasi, klik Indexes, lalu klik tab Composite.
Dalam daftar indeks komposit Anda, klik tombol More
untuk indeks yang ingin Anda hapus. Klik Delete.Konfirmasi bahwa Anda ingin menghapus indeks ini dengan mengklik Hapus Indeks dari pemberitahuan.
Menambahkan pengecualian indeks kolom tunggal
Pengecualian indeks kolom tunggal memungkinkan Anda mengganti setelan indeks otomatis untuk kolom tertentu dalam suatu koleksi. Anda dapat menambahkan pengecualian kolom tunggal dari konsol:
Di konsol Google Cloud, buka halaman Databases.
Pilih database yang diperlukan dari daftar database.
Di menu navigasi, klik Indexes, lalu klik tab Single Field.
Klik Tambahkan Pengecualian.
Masukkan ID Koleksi dan Jalur kolom.
Pilih setelan pengindeksan baru untuk kolom ini. Aktifkan atau nonaktifkan indeks kolom tunggal yang diperbarui secara otomatis menaik, menurun, dan berisi array untuk kolom ini.
Klik Simpan Pengecualian.
Menambahkan pengecualian tingkat koleksi
Untuk menentukan pengecualian indeks kolom tunggal yang berlaku untuk semua kolom dalam sebuah ID koleksi:
- Klik Tambahkan Pengecualian.
Masukkan ID Koleksi untuk grup koleksi dan tetapkan Jalur kolom sebagai
*
.Pilih pengecualian pengindeksan yang ingin Anda terapkan untuk semua kolom dalam grup koleksi.
Klik Simpan Pengecualian.
Menghapus pengecualian indeks kolom tunggal
Untuk menghapus pengecualian indeks kolom tunggal, lakukan langkah berikut:
Di konsol Google Cloud, buka halaman Databases.
Pilih database yang diperlukan dari daftar database.
Di menu navigasi, klik Indexes, lalu klik tab Single Field.
Dalam daftar pengecualian indeks kolom tunggal, klik tombol Lainnya
untuk pengecualian yang ingin dihapus. Klik Delete.Konfirmasi bahwa Anda ingin menghapus pengecualian ini dengan mengklik Hapus dari pemberitahuan.
Jika Anda menghapus pengecualian kolom tunggal, kolom atau sub-kolom yang ditentukan akan menggunakan setelan pengindeksan yang diwariskan. Kolom dokumen kembali ke setelan indeks otomatis database Anda. Sub-kolom dalam peta mewarisi pengecualian apa pun pada kolom induk sebelum mewarisi setelan indeks otomatis.
Menggunakan Firebase CLI
Anda juga dapat men-deploy indeks dengan Firebase CLI.
Untuk memulai, jalankan firebase init firestore
di direktori project Anda.
Selama penyiapan, Firebase CLI menghasilkan file JSON dengan indeks default dalam format yang tepat. Edit file untuk menambahkan lebih banyak indeks dan men-deploynya dengan perintah firebase deploy
.
Untuk men-deploy indeks dan aturan Firestore saja, tambahkan flag --only firestore
.
Jika mengedit indeks menggunakan Firebase console, pastikan Anda juga memperbarui file indeks lokal. Lihat referensi definisi indeks JSON.
Menggunakan Terraform
Membuat indeks dalam database
Database Firestore dapat menyertakan indeks kolom tunggal atau indeks komposit. Anda dapat mengedit file konfigurasi Terraform agar dapat membuat indeks untuk database Anda.
Indeks kolom tunggal
Contoh file konfigurasi Terraform berikut membuat indeks kolom tunggal di kolom name
dalam koleksi chatrooms
:
firestore.tf
resource "random_id" "variable"{ byte_length = 8 } resource "google_firestore_field" "single-index" { project = "project-id" database = "database-id" collection = "chatrooms_${random_id.variable.hex}" field = "name" index_config { indexes { order = "ASCENDING" query_scope = "COLLECTION_GROUP" } indexes { array_config = "CONTAINS" } } ttl_config {} }
- Ganti project-id dengan project ID Anda. Project ID harus unik.
- Ganti database-id dengan ID database Anda.
Indeks komposit
Contoh file konfigurasi Terraform berikut membuat indeks komposit untuk kombinasi kolom name
dan kolom description
dalam koleksi chatrooms
:
firestore.tf
resource "google_firestore_index" "composite-index" { project = "project-id" database = "database-id" collection = "chatrooms" fields { field_path = "name" order = "ASCENDING" } fields { field_path = "description" order = "DESCENDING" } }
- Ganti project-id dengan project ID Anda. Project ID harus unik.
- Ganti database-id dengan ID database Anda.
Waktu build indeks
Untuk mem-build indeks, Firestore harus menyiapkan indeks, lalu mengisi ulang indeks dengan data yang ada. Waktu build indeks adalah jumlah waktu penyiapan dan waktu pengisian ulang:
Menyiapkan indeks memerlukan waktu beberapa menit. Waktu build minimum untuk indeks adalah beberapa menit, meskipun untuk database yang kosong.
Waktu pengisian ulang bergantung pada jumlah data yang ada dalam indeks baru. Semakin banyak nilai kolom yang cocok dengan definisi indeks, semakin lama waktu yang diperlukan untuk mengisi ulang indeks.
Build indeks merupakan operasi yang berjalan lama.
Setelah Anda memulai build indeks, Firestore akan menetapkan nama yang unik pada operasi tersebut. Nama operasi diawali dengan projects/[PROJECT_ID]/databases/(default)/operations/
, misalnya:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Namun, Anda dapat tidak menyertakan awalan saat menentukan nama operasi untuk perintah describe
.
Mencantumkan semua operasi yang berjalan lama
Untuk mencantumkan operasi yang berjalan lama, gunakan perintah gcloud firestore operations list. Perintah ini mencantumkan operasi yang sedang berlangsung dan yang baru saja selesai. Operasi tercantum selama beberapa hari setelah selesai:
gcloud firestore operations list
Memeriksa status operasi
Alih-alih mencantumkan semua operasi yang berjalan lama, Anda dapat mencantumkan detail satu operasi:
gcloud firestore operations describe operation-name
Memperkirakan waktu penyelesaian
Saat operasi berjalan, lihat nilai kolom state
untuk mengetahui status operasi secara keseluruhan.
Permintaan untuk status operasi yang berjalan lama juga menampilkan metrik workEstimated
dan workCompleted
. Metrik ini ditampilkan untuk sejumlah dokumen. workEstimated
menunjukkan perkiraan jumlah total dokumen yang akan diproses dalam operasi. workCompleted
menunjukkan jumlah dokumen yang diproses sejauh ini. Setelah operasi selesai, workCompleted
mencerminkan jumlah total dokumen yang sebenarnya diproses yang mungkin berbeda dari nilai workEstimated
.
Bagilah workCompleted
dengan workEstimated
untuk mengetahui perkiraan kasar dari progresnya. Perkiraan ini mungkin tidak akurat karena tergantung pada pengumpulan statistik yang tertunda.
Misalnya, berikut adalah status progres dari suatu build indeks:
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressDocuments": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
Saat operasi selesai, deskripsi operasi akan berisi "done":
true
. Lihat nilai kolom state
untuk menemukan hasil operasi. Jika kolom done
tidak ditetapkan dalam respons, maka nilainya adalah false
. Jangan bergantung pada keberadaan nilai done
untuk operasi yang sedang berlangsung.
Error dalam mem-build indeks
Anda mungkin mengalami error dalam mem-build indeks saat mengelola indeks gabungan dan pengecualian indeks satu kolom. Operasi pengindeksan dapat gagal jika Firestore menemukan masalah dengan data yang diindeks. Biasanya, ini berarti Anda mencapai batas indeks. Misalnya, operasi mungkin telah mencapai jumlah entri indeks maksimum per dokumen.
Jika pembuatan indeks gagal, Anda melihat pesan error di konsol. Setelah memverifikasi bahwa Anda tidak mencapai batas indeks, coba lagi operasi indeks.