Kurangi biaya indeks dengan kolom peta

Halaman ini menjelaskan cara menggunakan kolom peta guna mengelola setelan indeks untuk sekelompok subkolom.

Sebagai praktik terbaik, Anda harus menghapus indeks yang tidak digunakan untuk mengurangi biaya penyimpanan dan meningkatkan performa penulisan. Secara default, Cloud Firestore mem-build indeks kolom tunggal untuk setiap kolom dalam dokumen. Anda dapat mengontrol pengindeksan kolom tunggal dengan menentukan pengecualian indeks tetapi dengan maksimum 200 pengecualian indeks kolom tunggal per database. Anda dapat mencapai batas ini sebelum menonaktifkan semua indeks kolom tunggal yang tidak digunakan.

Agar tidak mencapai batas pengecualian, Anda dapat mengelompokkan kolom dokumen dengan persyaratan indeks yang sama ke dalam sebuah kolom peta. Kemudian Anda dapat menerapkan pengecualian indeks pada kolom peta itu, dan pengecualian yang sama berlaku untuk subkolom peta.

Solusi: Gunakan kolom peta untuk membantu mengelola indeks

Bayangkan sebuah aplikasi yang bergantung pada koleksi dokumen game_event. Pertimbangkan dua model data berikut:

Kolom dokumen level teratas

Node.js
db.collection('game_events').doc().set({
   timestamp: Firestore.FieldValue.serverTimestamp(),
   user_id: 'huDIl8H88kFAFAdcHayf',
   team_id: '6Q5BhBESeTPk8LT0O59I',
   event_type: 'rare_item_drop',
   display_text: 'You found a rare item!',
});

Kolom dan sub-kolom peta

Dalam model data ini, semua kolom dokumen menjadi subkolom dari kolom details:

Node.js
db.collection('game_events').doc().set({
  details: {
    timestamp: Firestore.FieldValue.serverTimestamp(),
    user_id: 'huDIl8H88kFAFAdcHayf',
    team_id: '6Q5BhBESeTPk8LT0O59I',
    event_type: 'rare_item_drop',
    display_text: 'You found a rare item!',
  }
});

Asumsikan aplikasi ini selalu membuat kueri dokumen game_event berdasarkan user_id dan timestamp, atau team_id dan timestamp. Contoh:

Node.js
let query_user_events = db.collection('game_events')
                          .where('details.user_id', '==', 'huDIl8H88kFAFAdcHayf')
                          .orderBy('details.timestamp');

let query_team_events = db.collection('game_events')
                          .where('details.team_id', '==', '6Q5BhBESeTPk8LT0O59I')
                          .orderBy('details.timestamp');

Perhatikan hal berikut tentang aplikasi ini:

  • Aplikasi ini bergantung pada indeks gabungan untuk details.user_id, timestamp dan details.team_id, timestamp.
  • Aplikasi tidak menggunakan indeks kolom tunggal untuk timestamp, user_id, team_id, event_type, atau display_text.

Berdasarkan persyaratan indeks tersebut, sebaiknya nonaktifkan indeks kolom tunggal untuk timestamp, user_id, team_id, event_type, atau display_text. Sekarang, bandingkan pengecualian yang diperlukan untuk kedua model data tersebut.

Menonaktifkan indeks untuk kolom level teratas

Untuk menonaktifkan indeks kolom tunggal di model data kolom level teratas, Anda harus menentukan pengecualian untuk setiap kolom. Jumlah pengecualian Anda bertambah lima, dan jika Anda menambahkan kolom baru ke model data, Anda harus menentukan pengecualian lain untuk menonaktifkan indeks kolom tunggalnya.

Menonaktifkan indeks untuk subkolom

Untuk menonaktifkan indeks kolom tunggal model data subkolom dan peta, Anda dapat menentukan satu pengecualian untuk kolom peta. Pengecualian pada kolom peta menerapkan setelan pengindeksan yang sama pada subkolom peta. Jika Anda menambahkan subkolom baru ke kolom details, pengecualian akan otomatis menonaktifkan indeks kolom tunggal subkolom baru itu.

Misalnya, menggunakan Firebase CLI, tambahkan pengecualian indeks ini ke file firestore.indexes.json untuk menonaktifkan indeks kolom tunggal koleksi game_events:

{
    "collectionGroup": "game_events",
    "fieldPath": "details",
    "indexes": []
},

Jika setelahnya Anda memerlukan indeks kolom tunggal untuk salah satu subkolom, Anda dapat mengganti setelan indeks kolom peta dengan pengecualian. Pengecualian pada subkolom menggantikan setelan indeks yang diwariskan pada subkolom tersebut. Contoh:

{
    "collectionGroup": "game_events",
    "fieldPath": "details.event_type",
    "indexes": [
      {
        "order": "ASCENDING",
        "queryScope": "COLLECTION"
      },
    ]
},

Kapan pendekatan ini digunakan

Pada contoh di atas, pendekatan subkolom dan peta mengurangi jumlah pengecualian dari lima menjadi satu. Bayangkan model data dokumen serupa dengan dua ratus kolom. Pendekatan ini mengurangi jumlah pengecualian dari 200 menjadi 1.

Anda harus mempertimbangkan penggunaan pendekatan kolom dan subkolom peta saat model data dokumen Anda berisi beberapa kolom dengan indeks kolom tunggal yang tidak digunakan. Anda sebaiknya mempertimbangkan pendekatan ini untuk dokumen dengan banyak kolom.