Indeks merupakan faktor penting dalam performa database. Hampir sama seperti indeks buku yang memetakan topik dalam sebuah buku ke nomor halaman, indeks database memetakan item dalam database ke lokasinya masing-masing di dalam database. Saat Anda membuat kueri database, database tersebut dapat menggunakan indeks untuk dengan cepat mengidentifikasi lokasi item yang Anda minta.
Halaman ini berisi penjelasan mengenai dua jenis indeks yang digunakan Cloud Firestore, yaitu indeks kolom tunggal dan indeks komposit.
Definisi dan struktur indeks
Indeks ditentukan pada daftar kolom dari dokumen tertentu, dengan mode indeks yang sesuai untuk setiap kolom.
Indeks berisi entri untuk setiap kolom yang disebutkan dalam definisi indeks. Indeks mencakup semua dokumen yang merupakan hasil potensial untuk kueri berdasarkan indeks. Dokumen disertakan dalam indeks hanya jika memiliki nilai yang diindeks yang ditetapkan untuk setiap kolom yang digunakan dalam indeks. Jika definisi indeks mengacu pada kolom yang dokumennya belum memiliki nilai yang ditetapkan, dokumen tersebut tidak akan muncul dalam indeks. Dalam hal ini, dokumen tidak akan pernah ditampilkan sebagai hasil dari kueri apa pun yang didasarkan pada indeks.
Indeks komposit diurutkan berdasarkan nilai kolom, dalam urutan yang ditentukan dalam definisi indeks.
Indeks di balik setiap kueri
Jika tidak ada indeks untuk sebuah kueri, kebanyakan database akan meng-crawl kontennya item demi item. Proses ini berjalan lambat dan bahkan makin lambat lagi seiring pertumbuhan ukuran database. Cloud Firestore menjamin performa kueri yang tinggi dengan menggunakan indeks untuk semua kueri. Hasilnya, performa kueri bergantung pada ukuran kumpulan hasil, dan bukan pada jumlah item dalam database.
Makin sedikit pengelolaan indeks, makin banyak pengembangan aplikasi
Cloud Firestore menyertakan fitur yang mengurangi waktu yang diperlukan untuk mengelola indeks. Indeks yang diperlukan untuk kueri paling dasar dibuat otomatis untuk Anda. Saat Anda menggunakan dan menguji aplikasi, Cloud Firestore membantu Anda mengidentifikasi dan membuat indeks tambahan yang diperlukan aplikasi.
Jenis indeks
Cloud Firestore menggunakan dua jenis indeks, yaitu kolom tunggal dan komposit. Selain berbeda dalam hal jumlah kolom yang diindeks, kolom tunggal dan komposit juga berbeda cara pengelolaannya.
Indeks kolom tunggal
Indeks kolom tunggal menyimpan pemetaan urut semua dokumen dalam koleksi yang berisi kolom tertentu. Setiap entri pada indeks kolom tunggal mencatat nilai dokumen untuk kolom tertentu dan lokasi dokumen tersebut di database. Cloud Firestore menggunakan indeks ini untuk menjalankan banyak kueri dasar. Anda dapat mengelola indeks kolom tunggal dengan mengonfigurasi setelan pengindeksan otomatis dan pengecualian indeks database Anda.
Pengindeksan otomatis
Secara default, Cloud Firestore otomatis mempertahankan indeks kolom tunggal untuk setiap kolom dalam dokumen dan setiap subkolom dalam peta. Cloud Firestore menggunakan setelan default berikut untuk indeks kolom tunggal:
Untuk setiap kolom bukan array dan bukan peta, Cloud Firestore menentukan dua indeks kolom tunggal dengan cakupan koleksi satu dalam mode menaik dan satu dalam mode menurun.
Untuk setiap kolom peta, Cloud Firestore membuat hal berikut:
- Satu indeks menaik dengan cakupan koleksi untuk setiap subkolom bukan array dan bukan peta.
- Satu indeks menurun cakupan koleksi untuk setiap subkolom bukan array dan bukan peta.
- Satu indeks berisi array dengan cakupan koleksi untuk setiap subkolom array.
- Cloud Firestore mengindeks setiap subkolom peta secara rekursif.
Untuk setiap kolom array dalam dokumen, Cloud Firestore membuat dan mempertahankan indeks array-contains dengan cakupan koleksi.
Indeks kolom tunggal dengan cakupan grup koleksi tidak dipertahankan secara default.
Pengecualian indeks kolom tunggal
Anda bisa mengecualikan kolom dari setelan pengindeksan otomatis dengan membuat pengecualian indeks kolom tunggal. Pengecualian pengindeksan mengganti setelan indeks otomatis di seluruh database. Pengecualian dapat mengaktifkan indeks kolom tunggal yang dinonaktifkan oleh setelan pengindeksan otomatis. Sebaliknya, pengecualian juga dapat menonaktifkan indeks kolom tunggal yang diaktifkan oleh pengindeksan otomatis. Untuk mengetahui kasus seperti apa yang dapat memanfaatkan pengecualian, baca praktik terbaik pengindeksan.
Gunakan nilai jalur kolom *
untuk menambahkan pengecualian indeks level koleksi di semua kolom dalam suatu kelompok koleksi. Misalnya, untuk kelompok koleksi comments
, tetapkan jalur kolom ke *
agar cocok dengan semua kolom dalam kelompok koleksi comments
, dan nonaktifkan pengindeksan semua kolom dalam kelompok koleksi. Kemudian, Anda dapat menambahkan pengecualian untuk mengindeks hanya kolom yang diperlukan untuk kueri Anda. Mengurangi jumlah kolom yang diindeks mengurangi biaya penyimpanan dan dapat meningkatkan performa tulis.
Jika Anda membuat pengecualian indeks kolom tunggal untuk kolom peta, subkolom peta akan mewarisi setelan tersebut. Namun, Anda dapat menentukan pengecualian indeks kolom tunggal untuk subkolom tertentu. Jika Anda menghapus pengecualian untuk suatu subkolom, subkolom tersebut akan mewarisi setelan pengecualian induknya, jika ada, atau setelan seluruh database jika tidak ada pengecualian induk.
Untuk membuat dan mengelola pengecualian indeks kolom tunggal, baca bagian Mengelola indeks.
Indeks komposit
Indeks komposit menyimpan pemetaan urut semua dokumen dalam koleksi, berdasarkan daftar urut kolom yang akan diindeks.
Cloud Firestore menggunakan indeks komposit untuk mendukung kueri yang belum didukung oleh indeks kolom tunggal.
Cloud Firestore tidak membuat indeks komposit secara otomatis seperti halnya dengan indeks kolom tunggal karena banyaknya kemungkinan kombinasi kolom. Sebagai gantinya, Cloud Firestore membantu Anda mengidentifikasi dan membuat indeks komposit yang diperlukan saat Anda mem-build aplikasi.
Setiap kali Anda mencoba kueri yang tidak didukung oleh indeks, Cloud Firestore menampilkan pesan error dengan link yang dapat Anda ikuti untuk membuat indeks yang tidak ada.
Anda juga dapat menentukan dan mengelola indeks komposit secara manual menggunakan konsol atau Firebase CLI. Untuk mengetahui informasi lebih lanjut mengenai cara membuat dan mengelola indeks komposit, baca bagian Mengelola Indeks.
Mode indeks dan cakupan kueri
Indeks kolom tunggal dan komposit dikonfigurasi dengan cara berbeda, tetapi keduanya mengharuskan Anda mengonfigurasi mode indeks dan cakupan kueri untuk indeks Anda.
Mode indeks
Saat menentukan indeks, Anda memilih mode indeks untuk setiap kolom yang diindeks. Mode indeks setiap kolom mendukung klausa kueri tertentu pada kolom tersebut. Anda dapat memilih dari mode indeks berikut:
Mode indeks | Deskripsi |
---|---|
Menaik | Mendukung klausa kueri < , <= , == , >= , > , != , in , dan not-in di kolom dan mendukung pengurutan hasil secara menaik berdasarkan nilai kolom ini. |
Menurun | Mendukung klausa kueri < , <= , == , >= , > , != , in , dan not-in di kolom dan mendukung pengurutan hasil secara menurun berdasarkan nilai kolom ini. |
Array‑contains | Mendukung klausa kueri array-contains dan array-contains-any pada kolom. |
Vektor | Mendukung klausa kueri FindNearest di kolom. |
Cakupan kueri
Setiap indeks tercakup baik ke dalam koleksi maupun grup koleksi. Hal ini dikenal sebagai cakupan kueri indeks:
- Cakupan koleksi
- Cloud Firestore membuat indeks dengan cakupan koleksi secara default. Indeks ini mendukung kueri yang menampilkan hasil dari satu koleksi.
- Cakupan grup koleksi
- Grup koleksi mencakup semua koleksi dengan ID koleksi yang sama. Untuk menjalankan kueri grup koleksi yang menampilkan hasil yang difilter atau diurutkan dari grup koleksi, Anda harus membuat indeks yang sesuai dengan cakupan grup koleksi.
Pengurutan default dan kolom __name__
Selain mengurutkan dokumen berdasarkan mode indeks yang ditentukan untuk setiap kolom (menaik atau menurun), indeks juga menerapkan pengurutan akhir berdasarkan kolom __name__
di setiap dokumen. Nilai kolom __name__
ditetapkan ke jalur dokumen lengkap. Ini berarti, dokumen dalam hasil yang ditetapkan dengan nilai kolom yang sama diurutkan berdasarkan jalur dokumen.
Secara default, kolom __name__
diurutkan ke arah yang sama dengan kolom terakhir yang diurutkan dalam definisi indeks. Contoh:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
cities | __name__ |
name, Koleksi |
cities | __name__ |
state, Koleksi |
cities | __name__ |
country, population, Koleksi |
Untuk mengurutkan hasil menurut arah __name__
non-default, Anda perlu membuat indeks tersebut.
Properti indeks
Indeks yang memungkinkan kueri untuk dijalankan dengan paling efisien ditentukan oleh properti berikut:
- Kolom yang digunakan dalam filter kesetaraan
- Kolom yang digunakan dalam tata urutan
- Kolom yang digunakan dalam filter rentang & ketidaksetaraan (yang belum disertakan dalam tata urutan)
- Kolom yang digunakan dalam agregasi (yang belum disertakan dalam tata urutan serta filter rentang dan ketidaksetaraan)
Cloud Firestore menghitung hasil kueri sebagai berikut:
- Mengidentifikasi indeks yang sesuai dengan koleksi, properti filter, operator filter, dan tata urutan pada kueri.
- Mengidentifikasi posisi indeks tempat pemindaian dimulai. Posisi awal diawali dengan filter kesetaraan kueri dan diakhiri dengan filter rentang dan ketidaksetaraan di kolom
orderBy
pertama. - Mulai memindai indeks, yang menampilkan setiap dokumen yang memenuhi semua filter, hingga proses pemindaian melakukan salah satu hal berikut:
- Menemukan dokumen yang tidak memenuhi kondisi filter dan mengonfirmasi bahwa dokumen berikutnya tidak akan sepenuhnya memenuhi kondisi filter.
- Mencapai akhir indeks.
- Mengumpulkan jumlah hasil maksimum yang diminta oleh kueri.
Contoh pengindeksan
Dengan membuat indeks kolom tunggal secara otomatis, Cloud Firestore memungkinkan aplikasi Anda untuk mendukung kueri database yang paling dasar dengan cepat.
Dengan indeks kolom tunggal, Anda dapat menjalankan kueri sederhana berdasarkan nilai kolom dan pembanding <
, <=
, ==
, >=
, >
, dan in
. Untuk kolom array, indeks kolom tunggal memungkinkan Anda menjalankan kueri array-contains
dan array-contains-any
.
Sebagai ilustrasi, pelajari contoh berikut dari perspektif pembuatan indeks. Cuplikan berikut membuat beberapa dokumen city
dalam koleksi cities
dan menetapkan kolom name
, state
, country
, capital
, population
, dan tags
untuk setiap dokumen:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
Dengan asumsi setelan pengindeksan otomatis adalah default, Cloud Firestore memperbarui satu indeks kolom tunggal menaik per kolom bukan array, satu indeks kolom tunggal menurun per kolom bukan array, dan satu indeks kolom tunggal array-contains untuk kolom array. Setiap baris dalam tabel berikut mewakili entri dalam indeks kolom tunggal:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
cities | name | Koleksi |
cities | state | Koleksi |
cities | country | Koleksi |
cities | capital | Koleksi |
cities | population | Koleksi |
cities | name | Koleksi |
cities | state | Koleksi |
cities | country | Koleksi |
cities | capital | Koleksi |
cities | population | Koleksi |
cities | array-contains regions |
Koleksi |
Kueri yang didukung oleh indeks kolom tunggal
Dengan menggunakan indeks kolom tunggal yang dibuat secara otomatis ini, Anda dapat menjalankan kueri sederhana seperti berikut:
Web
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
Anda juga dapat membuat kueri in
dan kueri kesetaraan (==
) gabungan:
Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"]) // Compound equality queries citiesRef.where("state", "==", "CO").where("name", "==", "Denver") citiesRef.where("country", "==", "USA") .where("capital", "==", false) .where("state", "==", "CA") .where("population", "==", 860000)
Jika perlu menjalankan kueri gabungan yang menggunakan perbandingan rentang (<
, <=
, >
, atau >=
) atau jika perlu melakukan pengurutan berdasarkan kolom yang berbeda, Anda harus membuat indeks komposit untuk kueri tersebut.
Indeks array-contains
memungkinkan Anda membuat kueri untuk kolom array regions
:
Web
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
Kueri yang didukung oleh indeks komposit
Cloud Firestore menggunakan indeks komposit untuk mendukung kueri gabungan yang belum didukung oleh indeks kolom tunggal. Misalnya, Anda memerlukan indeks komposit untuk kueri berikut:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc") citiesRef.where("country", "==", "USA").where("population", "<", 3800000) citiesRef.where("country", "==", "USA").where("population", ">", 690000) // in and == clauses use the same index citiesRef.where("country", "in", ["USA", "Japan", "China"]) .where("population", ">", 690000)
Kueri ini memerlukan indeks komposit di bawah. Karena kueri ini menggunakan kesetaraan (==
atau in
) untuk kolom country
, Anda dapat menggunakan mode indeks menaik atau menurun untuk kolom ini. Secara default, klausa ketidaksetaraan menerapkan tata urutan menaik berdasarkan kolom dalam klausa ketidaksetaraan tersebut.
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
cities | (atau ) country, population | Koleksi |
Untuk menjalankan kueri yang sama, tetapi dengan tata urutan menurun, Anda memerlukan indeks komposit tambahan dalam arah menurun untuk population
:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "desc") citiesRef.where("country", "==", "USA") .where("population", "<", 3800000) .orderBy("population", "desc") citiesRef.where("country", "==", "USA") .where("population", ">", 690000) .orderBy("population", "desc") citiesRef.where("country", "in", ["USA", "Japan", "China"]) .where("population", ">", 690000) .orderBy("population", "desc")
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
cities | country, population | Koleksi |
cities | country, population | Koleksi |
Untuk menghindari penurunan performa yang disebabkan oleh penggabungan indeks, sebaiknya Anda membuat indeks komposit untuk menggabungkan kueri array-contains
atau array-contains-any
dengan klausul tambahan:
Web
citiesRef.where("regions", "array-contains", "east_coast") .where("capital", "==", true) // array-contains-any and array-contains use the same index citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"]) .where("capital", "==", true)
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
cities | tag array-contains, | (atau ) capitalKoleksi |
Kueri yang didukung oleh indeks grup koleksi
Untuk menunjukkan indeks dengan cakupan grup koleksi, tambahkan subkoleksi landmarks
ke beberapa dokumen city
:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Bridge", category : "bridge" }); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Park", category : "park" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Gallery of Art", category : "museum" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Mall", category : "park" });
Dengan menggunakan indeks kolom tunggal dengan cakupan koleksi berikut, Anda dapat membuat kueri untuk koleksi landmarks
suatu kota berdasarkan kolom category
:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
landmarks | (atau ) category | Koleksi |
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])
Jika Anda tertarik untuk membuat kueri tempat terkenal di semua kota, misalnya, Anda menjalankan kueri ini di grup koleksi yang terdiri dari semua koleksi landmarks
. Anda juga harus mengaktifkan indeks kolom tunggal landmarks
dengan
cakupan grup koleksi:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
landmarks | (atau ) category | Grup koleksi |
Dengan mengaktifkan indeks ini, Anda dapat membuat kueri untuk grup koleksi landmarks
:
Web
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Untuk menjalankan kueri grup koleksi yang menampilkan hasil yang difilter atau diurutkan, Anda harus mengaktifkan indeks kolom tunggal atau komposit yang sesuai dengan cakupan grup koleksi. Namun, definisi indeks tambahan tidak diperlukan oleh kueri grup koleksi yang tidak memfilter atau mengurutkan hasil.
Misalnya, Anda dapat menjalankan kueri grup koleksi berikut tanpa mengaktifkan indeks tambahan:
Web
db.collectionGroup("landmarks").get()
Entri indeks
Indeks dan struktur dokumen yang dikonfigurasi bagi project Anda akan menentukan jumlah entri indeks untuk dokumen. Entri indeks dihitung dalam batas jumlah entri indeks.
Contoh berikut menunjukkan entri indeks dokumen.
Dokumen
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Indeks Kolom Tunggal
- city_name ASC
- city_name DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains (ASC dan DESC)
Indeks komposit
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Entri indeks
Konfigurasi pengindeksan ini menghasilkan entri indeks berikut untuk dokumen:
Indeks | Data yang diindeks |
---|---|
Entri indeks kolom tunggal | |
city_name ASC | city_name: "San Francisco" |
city_name DESC | city_name: "San Francisco" |
temperatures.summer ASC | temperatures.summer: 67 |
temperatures.summer DESC | temperatures.summer: 67 |
temperatures.winter ASC | temperatures.winter: 55 |
temperatures.winter DESC | temperatures.winter: 55 |
neighborhoods Array Contains ASC | neighborhoods: "Mission" |
neighborhoods Array Contains DESC | neighborhoods: "Mission" |
neighborhoods Array Contains ASC | neighborhoods: "Downtown" |
neighborhoods Array Contains DESC | neighborhoods: "Downtown" |
neighborhoods Array Contains ASC | neighborhoods: "Marina" |
neighborhoods Array Contains DESC | neighborhoods: "Marina" |
Entri indeks komposit | |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
Indeks dan harga
Indeks termasuk dalam biaya penyimpanan aplikasi. Untuk informasi selengkapnya tentang cara menghitung ukuran penyimpanan indeks, lihat Ukuran entri indeks.
Menggunakan penggabungan indeks
Meskipun menggunakan indeks untuk setiap kueri, Cloud Firestore tidak memerlukan satu indeks per kueri. Untuk kueri dengan beberapa klausa kesetaraan (==
) dan satu klausa orderBy
(opsional), Cloud Firestore dapat menggunakan ulang indeks yang ada. Cloud Firestore dapat menggabungkan indeks untuk filter kesetaraan sederhana guna mem-build indeks komposit yang diperlukan untuk kueri kesetaraan yang lebih besar.
Anda dapat mengurangi biaya pengindeksan dengan mengidentifikasi situasi yang memungkinkan Anda menggunakan indeks
penggabungan. Misalnya, di koleksi restaurants
untuk aplikasi pemberian rating restoran:
restaurants
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Aplikasi ini menggunakan kueri seperti berikut. Aplikasi menggunakan kombinasi klausa kesetaraan untuk category
, city
, dan editors_pick
, sekaligus selalu mengurutkan star_rating
secara menaik:
Web
db.collection("restaurants").where("category", "==", "burgers") .orderBy("star_rating") db.collection("restaurants").where("city", "==", "San Francisco") .orderBy("star_rating") db.collection("restaurants").where("category", "==", "burgers") .where("city", "==", "San Francisco") .orderBy("star_rating") db.collection("restaurants").where("category", "==", "burgers") .where("city", "==" "San Francisco") .where("editors_pick", "==", true ) .orderBy("star_rating")
Anda dapat membuat indeks untuk setiap kueri:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
restaurants | category, star_rating | Koleksi |
restaurants | city, star_rating | Koleksi |
restaurants | category, city, star_rating | Koleksi |
restaurants | category, city, editors_pick, star_rating | Koleksi |
Sebagai solusi yang lebih baik, Anda dapat mengurangi jumlah indeks dengan memanfaatkan kemampuan Cloud Firestore dalam menggabungkan indeks untuk klausa kesetaraan:
Koleksi | Kolom yang diindeks | Cakupan kueri |
---|---|---|
restaurants | category, star_rating | Koleksi |
restaurants | city, star_rating | Koleksi |
restaurants | editors_pick, star_rating | Koleksi |
Selain lebih kecil, kumpulan indeks ini juga mendukung kueri tambahan:
Web
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
Batas pengindeksan
Batasan berikut berlaku pada indeks. Untuk mengetahui informasi selengkapnya tentang kuota dan batas, lihat Kuota dan batas.
Batas | Detail |
---|---|
Jumlah maksimum indeks komposit untuk database |
|
Jumlah maksimum konfigurasi kolom tunggal untuk database |
Satu konfigurasi tingkat kolom dapat berisi beberapa konfigurasi untuk kolom yang sama. Misalnya, pengecualian pengindeksan kolom tunggal dan kebijakan TTL pada kolom yang sama dihitung sebagai satu konfigurasi kolom terhadap batas. |
Jumlah maksimum entri indeks untuk setiap dokumen |
40.000 Jumlah entri indeks adalah jumlah hal berikut untuk dokumen:
Untuk melihat cara Cloud Firestore mengubah dokumen dan kumpulan indeks menjadi entri indeks, lihat contoh jumlah entri indeks ini. |
Jumlah maksimum kolom dalam indeks komposit | 100 |
Ukuran maksimum entri indeks |
7,5 KiB Untuk melihat cara Cloud Firestore menghitung ukuran entri indeks, lihat ukuran entri indeks. |
Jumlah maksimum ukuran entri indeks pada dokumen |
8 MiB Ukuran total adalah jumlah hal berikut untuk dokumen: |
Ukuran maksimum nilai kolom terindeks |
1.500 byte Nilai kolom di atas 1.500 byte akan terpotong. Kueri yang mencakup nilai kolom terpotong dapat menampilkan hasil yang tidak konsisten. |
Praktik terbaik pengindeksan
Untuk sebagian besar aplikasi, Anda dapat mengandalkan pengindeksan otomatis dan link pesan error untuk mengelola indeks Anda. Namun, Anda dapat menambahkan pengecualian kolom tunggal dalam kasus berikut:
Kasus | Deskripsi |
---|---|
Kolom string berukuran lebar | Jika memiliki kolom string yang biasanya memuat nilai string panjang yang tidak digunakan untuk membuat kueri, Anda dapat menghemat biaya penyimpanan dengan mengecualikan kolom tersebut dari pengindeksan. |
Tingkat operasi tulis yang tinggi ke koleksi yang berisi dokumen dengan nilai berurutan | Jika Anda mengindeks kolom yang meningkat atau menurun secara berurutan antardokumen dalam koleksi, misalnya stempel waktu, tingkat operasi tulis maksimum ke koleksi itu adalah 500 penulisan per detik. Jika tidak membuat kueri berdasarkan kolom yang memuat nilai berurutan, Anda dapat mengecualikan kolom itu dari pengindeksan untuk mengabaikan batas ini. Dalam kasus penggunaan IoT dengan tingkat operasi tulis yang tinggi, koleksi yang berisi dokumen dengan kolom stempel waktu mungkin akan mendekati batas 500 operasi tulis per detik. |
Kolom TTL |
Jika Anda menggunakan kebijakan TTL (time-to-live), perhatikan bahwa kolom TTL harus berupa stempel waktu. Pengindeksan pada kolom TTL diaktifkan secara default dan dapat memengaruhi performa pada tingkat traffic yang lebih tinggi. Sebagai praktik terbaik, tambahkan pengecualian satu kolom untuk kolom TTL Anda. |
Kolom peta atau array berukuran lebar | Kolom peta atau array berukuran lebar dapat mendekati batas entri indeks sebesar 40.000 per dokumen. Jika tidak membuat kueri berdasarkan kolom peta atau array berukuran lebar, sebaiknya Anda mengecualikannya dari pengindeksan. |
Jika Anda menggunakan kueri dengan operator rentang & ketidaksetaraan di beberapa kolom, lihat bagian pertimbangan pengindeksan yang sebaiknya Anda pertimbangkan untuk mengoptimalkan performa dan biaya kueri Cloud Firestore
Untuk mengetahui informasi selengkapnya tentang cara menyelesaikan masalah pengindeksan (fanout indeks, error INVALID_ARGUMENT
), lihat halaman pemecahan masalah.