Karena menyimpan data ke dalam baris dan kolom, maka jumlah nilai indeks yang dibutuhkan adalah

ARRAY DALAM C++PENGERTIANArray merupakan tipe data terstruktur yang berguna untuk menyimpan sejumlah datayang bertipe sama. Bagian yang menyusun array disebut elemen array(isi), yang masing-masing elemen dapat diakses tersendiri melalui indeks array.Antara satuVariabeldengan variabel lain di dalam array dibedakan berdasarkanSubscriptSebuah subscript berupa bilangan di dalam Kurung siku […]Melalui subscript inilah masing-masing elemen array dapat diakses.Sebagai contoh, misalkan terdapat array A yang memiliki 10 buah elemen nilai yang bertipeinteger, maka kita dapat mereprentasikannya dengan gambar berikut.Perbedaan Array dengan Variabel biasa

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 kueri dikirim ke suatu database, database tersebut dapat menggunakan indeks untuk dengan cepat menemukan lokasi item yang diminta.

Halaman ini berisi penjelasan mengenai dua jenis indeks yang digunakan Cloud Firestore, yaitu indeks kolom tunggal dan indeks komposit.

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 dapat 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 satu indeks menaik dan satu indeks menurun dengan cakupan koleksi untuk setiap subkolom bukan array dan bukan peta dalam peta.

  • 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.

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.

Catatan: Pengecualian hanya berlaku untuk setelan indeks otomatis. Kolom yang dikecualikan dari pengindeksan kolom tunggal masih dapat diindeks sebagai bagian dari indeks komposit.

Untuk membuat dan mengelola pengecualian indeks kolom tunggal, baca bagian Mengelola Indeks di Cloud Firestore.

Indeks komposit

Indeks komposit menyimpan pemetaan urut semua dokumen dalam koleksi, berdasarkan daftar urut kolom yang akan diindeks.

Catatan: Anda hanya dapat memiliki maksimal satu kolom array per indeks komposit.

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.

Jika Anda mencoba kueri di atas tanpa terlebih dahulu membuat indeks yang diperlukan, Cloud Firestore akan menampilkan pesan error yang berisi link yang bisa Anda buka untuk membuat indeks yang dibutuhkan. Ini terjadi setiap kali Anda mencoba kueri yang tidak didukung oleh sebuah indeks. 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 arrow_upward Mendukung klausa kueri <, <=, ==, >=, >, !=, in, dan not-in di kolom dan mendukung pengurutan hasil secara menaik berdasarkan nilai kolom ini.
Menurun arrow_downward 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.

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.

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 ini 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:

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 arrow_upward name Koleksi
cities arrow_upward state Koleksi
cities arrow_upward country Koleksi
cities arrow_upward capital Koleksi
cities arrow_upward population Koleksi
cities arrow_downward name Koleksi
cities arrow_downward state Koleksi
cities arrow_downward country Koleksi
cities arrow_downward capital Koleksi
cities arrow_downward 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:

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:

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:

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"])

Cloud Firestore menggunakan indeks komposit untuk mendukung kueri gabungan yang belum didukung oleh indeks kolom tunggal. Misalnya, Anda memerlukan indeks komposit untuk kueri berikut:

citiesRef.where("country", "==", "USA").orderBy("population", "asc") 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 arrow_upward (atau arrow_downward) country, arrow_upward population Koleksi

Untuk menjalankan kueri yang sama, tetapi dengan tata urutan menurun, Anda memerlukan indeks komposit tambahan dalam arah menurun untuk population:

citiesRef.where("country", "==", "USA").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 arrow_upward country, arrow_upward population Koleksi
cities arrow_upward country, arrow_downward population Koleksi

Anda juga perlu membuat indeks komposit untuk menggabungkan kueri array-contains atau array-contains-any dengan klausa tambahan.

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, arrow_upward (atau arrow_downward) capital Koleksi

Untuk menunjukkan indeks dengan cakupan grup koleksi, bayangkan Anda menambahkan subkoleksi landmarks ke beberapa dokumen city:

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 arrow_upward (atau arrow_downward) category Koleksi

citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

Bayangkan Anda tertarik membuat kueri untuk tempat terkenal di semua kota. Untuk menjalankan kueri ini di grup koleksi yang terdiri dari semua koleksi landmarks, Anda harus mengaktifkan indeks kolom tunggal landmarks dengan cakupan grup koleksi:

Koleksi Kolom yang diindeks Cakupan kueri
landmarks arrow_upward (atau arrow_downward) category Grup koleksi

Dengan mengaktifkan indeks ini, Anda dapat membuat kueri untuk grup koleksi landmarks:

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:

db.collectionGroup("landmarks").get()

Baik indeks yang dikonfigurasi untuk project Anda maupun struktur dokumen memengaruhi entri indeks untuk dokumen, yang pada akhirnya diperhitungkan dalam batas jumlah entri indeks.

Berikut adalah contoh untuk mengilustrasikannya.

Dokumen

name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

Indeks Kolom Tunggal

  • (Otomatis) name ASC & DESC
  • (Otomatis) temperatures ASC & DESC
  • (Otomatis) neighborhoods Array Contains

Indeks Komposit

  • name ASC, neighborhoods ASC
  • name DESC, neighborhoods ASC

Entri Indeks yang Dihasilkan

Konfigurasi pengindeksan ini menghasilkan 12 entri indeks berikut ini untuk dokumen:

Indeks Entri
name ASC & DESC name: "San Francisco"
temperatures ASC & DESC temperatures.summer: 67
temperatures ASC & DESC temperatures.winter: 55
neighborhoods Array Contains neighborhoods: "Mission"
neighborhoods Array Contains neighborhoods: "Downtown"
neighborhoods Array Contains neighborhoods: "Marina"
name ASC, neighborhoods ASC name: "San Francisco", neighborhoods: "Mission"
name ASC, neighborhoods ASC name: "San Francisco", neighborhoods: "Downtown"
name ASC, neighborhoods ASC name: "San Francisco", neighborhoods: "Marina"
name DESC, neighborhoods ASC name: "San Francisco", neighborhoods: "Mission"
name DESC, neighborhoods ASC name: "San Francisco", neighborhoods: "Downtown"
name DESC, neighborhoods ASC name: "San Francisco", neighborhoods: "Marina"

Indeks dan harga

Indeks termasuk dalam biaya penyimpanan aplikasi. Untuk mengetahui lebih lanjut penghitungan ukuran penyimpanan untuk indeks, lihat Ukuran entri indeks.

Memanfaatkan penggabungan indeks

Meskipun Cloud Firestore menggunakan satu indeks untuk setiap kueri, bukan berarti satu indeks harus khusus digunakan untuk satu 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 bisa mendapat manfaat dari penggabungan indeks. Misalnya, bayangkan koleksi restaurants untuk aplikasi pemberian rating restoran:

  • collections_bookmark restaurants

    • class burgerthyme

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

Sekarang, bayangkan aplikasi ini menggunakan kueri seperti di bawah. Perhatikan bahwa aplikasi menggunakan kombinasi klausa kesetaraan untuk category, city, dan editors_pick, sekaligus selalu mengurutkan star_rating secara menaik:

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 arrow_upward category, arrow_upward star_rating Koleksi
restaurants arrow_upward city, arrow_upward star_rating Koleksi
restaurants arrow_upward category, arrow_upward city, arrow_upward star_rating Koleksi
restaurants arrow_upward category, arrow_upward city, arrow_upward editors_pick, arrow_upward 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 arrow_upward category, arrow_upward star_rating Koleksi
restaurants arrow_upward city, arrow_upward star_rating Koleksi
restaurants arrow_upward editors_pick, arrow_upward star_rating Koleksi

Selain lebih kecil, kumpulan indeks ini juga mendukung kueri tambahan:

db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")

Batas pengindeksan

Batasan berikut berlaku pada indeks. Untuk mengetahui semua kuota dan batas, lihat Kuota dan Batas.

Batas Detail
Jumlah maksimum indeks komposit untuk database 200
Jumlah maksimum konfigurasi kolom tunggal untuk database

200

Total 200 konfigurasi tingkat kolom yang diizinkan. Satu konfigurasi 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:

  • Jumlah entri indeks kolom tunggal
  • Jumlah entri indeks komposit

Untuk melihat cara Cloud Firestore mengubah dokumen dan kumpulan indeks menjadi entri indeks, lihat contoh jumlah entri indeks ini.

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:

  • Jumlah ukuran entri indeks kolom tunggal pada dokumen
  • Jumlah ukuran entri indeks komposit pada 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 yang panjang, yang tidak digunakan untuk membuat kueri, Anda dapat menghemat biaya penyimpanan dengan mengecualikan kolom itu 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, seperti stempel waktu, maka 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 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.