Indexkosten mit Map-Feldern reduzieren
Auf dieser Seite wird beschrieben, wie Sie mit einem Zuordnungsfeld Indexeinstellungen für eine Gruppe von Unterfeldern verwalten.
Als Best Practice sollten Sie nicht verwendete Indexe entfernen, um die Speicherkosten zu senken und die Schreibleistung zu verbessern. Standardmäßig erstellt Firestore einen Einzelfeldindex für jedes Feld in einem Dokument. Sie können die Indexierung einzelner Felder steuern, indem Sie Indexausnahmen mit maximal 200 Einzelfeldindex-Ausnahmen pro Datenbank definieren. Dieses Limit kann erreicht werden, bevor alle nicht verwendeten Einzelfeldindexe deaktiviert werden.
Sie können das Ausnahmelimit vermeiden, indem Sie Dokumentfelder mit denselben Indexanforderungen unter einem Kartenfeld gruppieren. Sie können dann eine Indexausnahme auf das Kartenfeld anwenden und dieselbe Ausnahme gilt für die Unterfelder der Karte.
Lösung: Kartenfelder zur Verwaltung von Indexen verwenden
Stellen Sie sich eine Anwendung vor, die von einer Sammlung von game_event
-Dokumenten abhängt. Betrachten Sie die folgenden zwei Datenmodelle:
Dokumentfelder der obersten Ebene
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!', });
Kartenfeld und untergeordnete Felder
In diesem Datenmodell werden alle Dokumentfelder zu untergeordneten Feldern des Felds 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!', } });
Angenommen, diese Anwendung fragt immer game_event
-Dokumente basierend auf user_id
und timestamp
oder team_id
und timestamp
ab. Beispiel:
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');
Beachten Sie bei dieser Anwendung Folgendes:
- Die Anwendung hängt von den zusammengesetzten Indexen für
details.user_id, timestamp
unddetails.team_id, timestamp
ab. - Die Anwendung verwendet keine Einzelfeldindexe für
timestamp
,user_id
,team_id
,event_type
oderdisplay_text
.
Basierend auf diesen Indexanforderungen empfiehlt es sich, die Indexe für einzelne Felder für timestamp
, user_id
, team_id
, event_type
oder display_text
zu deaktivieren.
Vergleichen Sie nun die Ausnahmen für die beiden Datenmodelle.
Indexe für Felder der obersten Ebene werden deaktiviert
Wenn Sie die Einzelfeldindexe in einem Datenmodell der obersten Ebene deaktivieren möchten, müssen Sie für jedes Feld eine Ausnahme definieren. Die Anzahl der Ausnahmen erhöht sich um fünf. Wenn Sie Ihrem Datenmodell ein neues Feld hinzufügen, müssen Sie eine weitere Ausnahme definieren, um den Einzelfeldindex zu deaktivieren.
Indexe für untergeordnete Felder deaktivieren
Um die Einzelfeldindexe für ein Daten- und Unterfelderdatenmodell zu deaktivieren, können Sie eine einzelne Ausnahme für das Zuordnungsfeld definieren. Eine Ausnahme von einem Kartenfeld wendet dieselben Indexierungseinstellungen auf die Unterfelder der Karte an. Wenn Sie ein neues Unterfeld zum Feld details
hinzufügen, wird die Ausnahme durch den Einzelfeldindex des neuen Unterfelds automatisch deaktiviert.
Fügen Sie beispielsweise mit der Firebase CLI der Indexdatei firestore.indexes.json
diese Indexausnahme hinzu, um die Einzelfeldindexe für die Sammlung game_events
zu deaktivieren:
{ "collectionGroup": "game_events", "fieldPath": "details", "indexes": [] },
Wenn Sie später einen Einzelfeldindex für eines der Unterfelder benötigen, können Sie die Indexeinstellung des Kartenfelds mit einer Ausnahme überschreiben. Eine Ausnahme für ein Unterfeld überschreibt die übernommenen Indexeinstellungen dieses Unterfelds. Beispiel:
{ "collectionGroup": "game_events", "fieldPath": "details.event_type", "indexes": [ { "order": "ASCENDING", "queryScope": "COLLECTION" }, ] },
Wann ist dieser Ansatz zu verwenden?
Im obigen Beispiel verringerten die Karten- und Unterfelder die Anzahl der Ausnahmen von fünf auf eins. Stellen Sie sich beispielsweise ein ähnliches Dokumentdatenmodell mit zwei hundert verschachtelten Feldern vor. Dieser Ansatz reduziert die Anzahl der Ausnahmen von 200 auf 1.
Wenn Ihr Dokumentdatenmodell mehrere Felder mit nicht verwendeten Einzelfeldindizes enthält, sollten Sie die Verwendung eines Zuordnungsfelds und von Teilfeldern in Betracht ziehen. Dieser Ansatz eignet sich besonders für Dokumente mit vielen Feldern.