Abfrageleistung optimieren

Verwenden Sie Query Explain, um den Abfrageausführungs plan und das Laufzeit-Ausführungsprofil abzurufen und so Fehler bei langsamen Abfragen zu beheben. Im folgenden Abschnitt werden Schritte beschrieben, die Sie je nach Ausführungsprofil zur Optimierung der Abfrageleistung ausführen können:

Anzahl der Ergebnisse begrenzen

Verwenden Sie das Feld „Zurückgegebene Datensätze“ in der Ausführungsstruktur, um zu ermitteln, ob die Abfrage viele Dokumente zurückgibt. Sie können die Anzahl der zurückgegebenen Dokumente mit der Phase limit(...) begrenzen. Dadurch wird die serialisierte Bytegröße der Ergebnisse reduziert, wenn sie über das Netzwerk an die Clients zurückgegeben werden. Wenn dem Knoten Limit ein Knoten MajorSort vorangestellt ist, kann die Abfrage-Engine die Knoten Limit und MajorSort zusammenführen und eine vollständige In-Memory-Materialisierung und -Sortierung durch eine TopN-Sortierung ersetzen. Dadurch wird der Speicherbedarf für die Abfrage reduziert.

Größe des Ergebnisdokuments begrenzen

Sie können die Größe des zurückgegebenen Dokuments mit select(...) begrenzen, um nur die erforderlichen Felder zurückzugeben, oder mit remove_fields(...), um zu große Felder zu verwerfen. Dadurch werden die Compute- und Speicherkosten für die Verarbeitung von Zwischenergebnissen und die serialisierte Bytegröße der Ergebnisse reduziert, wenn sie über das Netzwerk an die Clients zurückgegeben werden. Wenn alle in der Abfrage referenzierten Felder von einem regulären Index abgedeckt werden, kann die Abfrage auch vollständig durch die Indexsuche abgedeckt werden. So müssen keine Dokumente aus dem primären Speicher abgerufen werden.

Indexe verwenden

Folgen Sie der Anleitung unten, um Indexe einzurichten und zu optimieren.

Ermitteln, ob die Abfrage einen Index verwendet

Sie können ermitteln, ob die Abfrage einen Index verwendet, indem Sie die Blattknoten in der Ausführungsstruktur prüfen. Wenn der Blattknoten der Ausführungsstruktur ein TableScan-Knoten ist, verwendet die Abfrage keinen Index und durchsucht Dokumente im primären Speicher. Wenn ein Index verwendet wird, werden im Blattknoten der Ausführungsstruktur die Index-ID und die Indexfelder des Index angezeigt.

Besseren Index ermitteln

Ein Index ist für eine Abfrage nützlich, wenn er die Anzahl der Dokumente reduzieren kann, die die Abfrage-Engine aus dem primären Speicher abrufen muss, oder wenn die Feldreihenfolge die Sortieranforderung der Abfrage erfüllen kann.

Wenn ein Index für eine Abfrage verwendet wird, die Abfrage-Engine aber immer noch viele Dokumente abruft und verwirft (erkennbar an einem Scan-Knoten, der viele Datensätze zurückgibt, gefolgt von einem Filter-Knoten der nur wenige Datensätze zurückgibt), ist das Prädikat der Abfrage, das mit dem Index erfüllt wird, nicht selektiv. Informationen zum Erstellen eines geeigneteren Index finden Sie unter Indexe erstellen.

Wenn ein Index für eine Abfrage verwendet wird, die Abfrage-Engine aber immer noch eine In-Memory-Neusortierung des Ergebnissatzes durchführt (erkennbar an einem MajorSort-Knoten in der Ausführungsstruktur der Abfrage), kann der verwendete Index nicht verwendet werden, um die Sortieranforderung der Abfrage zu erfüllen. Informationen zum Erstellen eines geeigneteren Index finden Sie im nächsten Abschnitt.

Indexe erstellen

Folgen Sie der Dokumentation zur Indexverwaltung, um Indexe zu erstellen. Damit Ihre Abfrage Indexe verwenden kann, erstellen Sie reguläre (keine Multikey-)Indexe mit Feldern in der folgenden Reihenfolge:

  1. Alle Felder, die in Gleichheitsoperatoren verwendet werden. Um die Wahrscheinlichkeit der Wiederverwendung in Abfragen zu maximieren, sortieren Sie die Felder in absteigender Reihenfolge ihrer Häufigkeit in Gleichheitsoperatoren in Abfragen.
  2. Alle Felder, nach denen sortiert wird (in derselben Reihenfolge).
  3. Felder, die in Bereichs- oder Ungleichheitsoperatoren verwendet werden, in absteigender Reihenfolge der Selektivität der Abfrageeinschränkung.
  4. Felder, die als Teil einer Abfrage im Index zurückgegeben werden: Wenn Sie solche Felder in den Index aufnehmen, kann die Abfrage durch den Index abgedeckt werden und es ist nicht erforderlich, Dokumente aus dem primären Speicher abzurufen.

Index- oder Tabellenscan erzwingen

Wenn Sie Firestore im nativen Modus abfragen, werden automatisch alle Indexe verwendet, die die Effizienz der Abfrage wahrscheinlich erhöhen. Daher müssen Sie für Ihre Abfragen keinen Index angeben. Für Abfragen, die für Ihre Arbeitslast entscheidend sind, empfehlen wir jedoch, die Option forceIndex zu verwenden, um eine konsistentere Leistung zu erzielen.

In einigen Fällen wählt Firestore im nativen Modus möglicherweise einen Index aus, der die Abfragelatenz erhöht. Wenn Sie die Schritte zur Fehlerbehebung bei Leistungsabfällen ausgeführt haben und bestätigt haben, dass es sinnvoll ist, die Abfrage mit einem anderen Index zu versuchen, können Sie den Index mit der Option forceIndex angeben.

Sie können die Option forceIndex in jeder Eingabephase in Pipeline-Vorgängen verwenden, um den Standardabfrageplan von Firestore im nativen Modus zu überschreiben und einen zu verwendenden Index anzugeben oder einen Tabellenscan zu erzwingen.

Bestimmten Index erzwingen

Wenn Sie erzwingen möchten, dass die Abfrage einen bestimmten Index verwendet, geben Sie die Index-ID als String für die Option forceIndex an. Sie finden die Index-ID in der Konsole oder in Fehlermeldungen.

Im folgenden Beispiel wird der Planer gezwungen, den Index mit der ID CICAgOi36pgK zu verwenden:

// Force Planner to use Index ID CICAgOi36pgK
db.pipeline()
  .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" })
  .limit(100)

Hier sind einige Anwendungsfälle für das Erzwingen eines bestimmten Index:

  • Leistung verschiedener Indexe testen.
  • Sicherstellen, dass ein bestimmter, bekanntermaßen optimaler Index für eine Abfrage verwendet wird.
  • Optimierungstool überschreiben, wenn die Standardauswahl für eine bestimmte Abfrage suboptimal ist.

Wenn der angegebene Index nicht gefunden wird, schlägt die Abfrage fehl.

Tabellenscan erzwingen

Bei einem Tabellenscan werden Dokumente in der Sammlung oder Sammlungsgruppe gelesen, ohne sekundäre Indexe zu verwenden. Wenn Sie einen Tabellenscan erzwingen möchten, legen Sie für forceIndex den Wert primary fest.

Im folgenden Beispiel wird ein Tabellenscan erzwungen:

// Force Planner to only do a Full-Table Scan
db.pipeline()
  .collectionGroup({ collectionId: "customers", forceIndex: "primary" })
  .limit(100)

In den folgenden Fällen kann ein Tabellenscan sinnvoll sein:

  • Bei sehr kleinen Sammlungen, bei denen der Index-Overhead nicht gerechtfertigt ist.
  • Bei Abfragen, die auf die meisten Dokumente in einer Sammlung zugreifen.
  • Für Debugging und Leistungsvergleiche.

forceIndex mit Query Explain verwenden

Sie können Query Explain, insbesondere mit der Option analyze, verwenden, um die Auswirkungen von forceIndex zu beobachten:

  • Prüfen Sie, ob Firestore im nativen Modus den in forceIndex angegebenen Index verwendet hat. Suchen Sie dazu in den Blattknoten der Ausführungsstruktur nach der Index-ID.
  • Prüfen Sie, ob im Plan ein TableScan-Knoten angezeigt wird, wenn Sie forceIndex: "primary" verwenden.
  • Vergleichen Sie die Leistungsmesswerte wie Latenz, gescannte Dokumente und gescannte Indexeinträge mit und ohne forceIndex, um die Abfrageleistung zu optimieren.

Best Practices für forceIndex

Mit forceIndex haben Sie zwar mehr Kontrolle über die Abfrageausführung, aber das Abfrageoptimierungstool von Firestore im nativen Modus ist in den meisten Anwendungsfällen in der Regel effizient. Beachten Sie die folgenden Best Practices, wenn Sie forceIndex verwenden:

  • Verwenden Sie forceIndex mit Bedacht. Wenn Sie mit dem Standardabfrageplan eine suboptimale Leistung feststellen, verwenden Sie Query Explain, um das Problem zu diagnostizieren , bevor Sie einen Index erzwingen.
  • Wenn Sie forceIndex verwenden, testen Sie Ihre Abfragen mit realistischen Datenmengen, um die Leistung und die Kosten zu ermitteln.
  • Vermeiden Sie die Verwendung von forceIndex: "primary" für große Sammlungen in Produktions umgebungen.