Ringkasan indeks edisi Enterprise
Perilaku pengindeksan bergantung pada edisi database. Halaman ini menjelaskan pengindeksan untuk edisi Firestore Enterprise. Untuk edisi Firestore Standard, lihat Ringkasan indeks edisi Firestore Standard.
Bagian ini menjelaskan pengindeksan untuk edisi Firestore Enterprise. Edisi Firestore Enterprise tidak membuat indeks apa pun secara default. Untuk mengurangi biaya dan meningkatkan performa database, buat indeks untuk kueri yang paling sering Anda gunakan.
Indeks memiliki dampak besar pada performa database. Jika ada indeks untuk kueri, database dapat menampilkan hasil secara efisien dengan mengurangi jumlah data yang perlu dipindai dan mengurangi pekerjaan yang diperlukan untuk mengurutkan hasil. Namun, entri indeks meningkatkan biaya penyimpanan dan jumlah pekerjaan yang dilakukan selama operasi tulis pada kolom yang diindeks.
Definisi dan struktur indeks
Indeks terdiri dari hal-hal berikut:
- ID koleksi
- daftar kolom dalam koleksi tertentu
- mode indeks, baik menaik, menurun, atau array-contains, untuk setiap kolom
Indeks juga dapat mengaktifkan opsi sparse atau unique.
Pengurutan indeks
Urutan dan arah pengurutan setiap kolom menentukan indeks secara unik. Misalnya, indeks berikut adalah dua indeks yang berbeda dan tidak dapat dipertukarkan:
| Koleksi | Kolom |
|---|---|
| cities | country (menaik), population (menurun) |
| cities | population (menurun), country (menaik), |
Saat membuat indeks untuk mendukung kueri, sertakan kolom dalam urutan yang sama dengan kueri Anda.
Kepadatan indeks
Secara default, entri indeks menyimpan data dari semua dokumen dalam koleksi. Hal ini dikenal sebagai indeks non-sparse. Entri indeks akan ditambahkan untuk dokumen, terlepas dari apakah dokumen berisi kolom yang ditentukan dalam indeks atau tidak. Kolom yang tidak ada diperlakukan sebagai memiliki nilai NULL saat membuat entri indeks. Untuk mengubah perilaku ini, Anda dapat menentukan indeks sebagai indeks sparse.
Indeks sparse
Indeks sparse hanya mengindeks dokumen dalam koleksi yang berisi nilai (termasuk null) untuk setidaknya salah satu kolom terindeks. Indeks sparse mengurangi biaya penyimpanan dan dapat meningkatkan performa.
Indeks array-contains
Untuk mengoptimalkan performa kueri saat membuat kueri kolom array menggunakan
array-contains atau array-contains-any, Anda dapat mengindeks kolom dalam
mode array-contains. Indeks dapat memiliki maksimal satu kolom dalam mode
array-contains.
Dengan mengindeks kolom array dalam mode array-contains, mesin kueri dapat dengan cepat menemukan dokumen yang berisi nilai array tertentu. Tanpa indeks,
kueri akan memeriksa nilai array dengan melakukan pemindaian koleksi secara keseluruhan,
yang meningkatkan latensi kueri dan biaya baca seiring bertambahnya ukuran koleksi.
Untuk mengindeks kolom array, kolom tersebut harus memenuhi persyaratan berikut:
- Persyaratan array tidak kosong: Entri indeks dibuat hanya jika kolom array ada dalam dokumen dan merupakan array tidak kosong. Dokumen dengan kolom yang tidak ada, bukan array, atau array kosong tidak diindeks.
Kaitan kepadatan dengan indeks array-contains
Untuk indeks yang menyertakan kolom array-contains, aturan kepadatan indeks
hanya berlaku untuk kolom terindeks yang diurutkan. Jika persyaratan array tidak kosong
terpenuhi, aturan kepadatan berlaku untuk kolom berindeks yang diurutkan dan tersisa dalam
indeks:
- Indeks non-sparse (
DENSE): Entri indeks dibuat untuk dokumen. Kolom indeks berurutan yang tidak ada dalam indeks disimpan sebagainulldalam entri indeks. - Indeks sparse (
SPARSE): Entri indeks dibuat hanya jika setidaknya satu kolom terindeks yang diurutkan ada dalam dokumen.
Contoh: Pembuatan entri indeks
Pertimbangkan indeks users (tags[*], status ASC):
| Dokumen | Indeks NON-SPARSE |
Indeks SPARSE |
|---|---|---|
{ |
Diindeks: • (tag: "news", status: "active") |
Diindeks: • (tag: "news", status: "active") |
{ |
Diindeks: • (tag: "news", status: "active") • (tag: "sports", status: "active") |
Diindeks: • (tag: "news", status: "active") • (tag: "sports", status: "active") |
{ |
Diindeks: • (tag: "news", status: "active") (dihapus duplikatnya) |
Diindeks: • (tag: "news", status: "active") (dideduplikasi) |
{ |
Diindeks: • (tag: null, status: "active") |
Diindeks: • (tag: null, status: "active") |
{ |
Diindeks: • (tag: "news", status: null) |
Tidak diindeks (kolom status tidak ada) |
{ |
Tidak diindeks (kolom bukan berupa array) | Tidak diindeks (kolom bukan array) |
{ |
Tidak diindeks (kolom bukan array) | Tidak diindeks (kolom bukan array) |
{ |
Tidak diindeks (kolom tags tidak ada) |
Tidak diindeks (kolom tags tidak ada) |
{ |
Tidak diindeks (array kosong) | Tidak diindeks (array kosong) |
Contoh kueri
Web
// Query for users where 'tags' contains 'news' and 'status' is 'active' const query = db.collection("users") .where("tags", "array-contains", "news") .where("status", "==", "active"); // Documents returned by the query: // [ // { // "id": "alice", // "tags": ["news", "tech"], // "status": "active" // } // ]
Indeks unik
Tetapkan opsi indeks unik untuk menerapkan nilai unik untuk kolom yang diindeks. Untuk indeks pada beberapa kolom, setiap kombinasi nilai harus unik di seluruh indeks. Database menolak semua operasi update dan penyisipan yang mencoba membuat entri indeks dengan nilai duplikat. Jika data kolom yang diindeks berisi nilai duplikat dan Anda mencoba membuat indeks unik, pembuatan indeks akan gagal dengan pesan error dalam detail operasi.
Kolom yang tidak ada dalam indeks unik
Jika Anda menyisipkan dokumen dengan kolom yang tidak ada untuk indeks unik, indeks
akan menetapkan nilai null untuk kolom yang tidak ada. Entri indeks yang dihasilkan harus unik atau operasi gagal.
Misalnya, dengan indeks ini:
| Koleksi | Kolom yang diindeks | Cakupan kueri |
|---|---|---|
| cities | nama (menaik) | Koleksi |
Jika Anda menambahkan dokumen {"abbreviation": "LA"} ke koleksi, indeks unik akan membuat entri dengan name disetel ke null. Jika Anda kemudian mencoba menambahkan
dokumen {"abbreviation": "NYC"}, operasi akan gagal karena entri
yang dihasilkan untuk indeks unik sama.
Perilaku yang sama berlaku untuk indeks unik dengan beberapa kolom.
Saat membuat atau memperbarui dokumen, kolom
yang diindeks yang tidak ada akan ditetapkan ke null dan entri indeks yang dihasilkan harus
unik dalam indeks.
Indeks unik pada nilai array
Indeks array-contains yang unik melarang dokumen dengan elemen array yang tumpang-tindih.
Jenis indeks ini tidak mengharuskan array memiliki nilai unik dalam satu dokumen.
Misalnya, dengan indeks unik pada kolom bernama tags:
Dokumen berikut, doc1, valid untuk disisipkan:
{
"tags": [ "news", "tech", "news", "music" ]
}
Indeks mengizinkan nilai duplikat ("news") dalam array yang sama dari
satu dokumen.
Jika Anda mencoba menyisipkan dokumen kedua, doc2, dengan elemen duplikat, operasi akan gagal:
{
"tags": [ "sports", "music" ]
}
Operasi gagal karena "music" sudah ada dalam array doc1 dan dipetakan dalam indeks.
Jika Anda perlu memastikan bahwa elemen dalam array yang sama dalam satu dokumen bersifat unik, tangani hal ini dalam logika aplikasi Anda.
Array kosong, kolom yang tidak ada, dan nilai null
Biasanya, kolom yang tidak ada dalam indeks unik diperlakukan sebagai null dan harus
unik di seluruh dokumen (lihat
Kolom yang tidak ada dalam indeks unik).
Namun, untuk indeks unik pada kolom array:
- Array kosong, kolom yang tidak ada, dan null mandiri: Jika kolom array kosong, tidak ada sama sekali, atau menyimpan nilai
nullmandiri (tidak di dalam array), tidak ada kunci indeks yang dihasilkan untuk dokumen. Oleh karena itu, beberapa dokumen dapat memiliki kolom kosong atau nilainullmandiri tanpa memicu error kunci duplikat. - Elemen null di dalam array: Jika array berisi nilai
nullsebagai elemen (misalnya,["news", null]), elemennulldiindeks. Dokumen berikutnya yang berisi elemennulldi kolom array yang diindeks akan gagal dengan error kunci duplikat.
Memecahkan masalah error pembuatan indeks
Anda mungkin mengalami error pembuatan indeks saat mengelola indeks. Operasi pengindeksan dapat gagal jika database mengalami masalah dengan data. Operasi pengindeksan dapat gagal karena alasan berikut:
- Anda telah mencapai batas indeks. Misalnya, operasi mungkin telah mencapai jumlah entri indeks maksimum per dokumen. Jika pembuatan indeks gagal, Anda akan melihat pesan error. Jika Anda belum mencapai batas indeks, coba lagi operasi indeks.
- Anda menetapkan opsi indeks unik dan data kolom yang diindeks akan membuat entri indeks duplikat. Untuk melanjutkan, hapus kombinasi nilai duplikat dari data.