Freigeben über


Bewährte Methoden für die Indizierung in Azure Cosmos DB for MongoDB vCore

GILT FÜR: MongoDB-vCore

Für abfragefähige Felder sollten immer Indizes erstellt werden

Auf Prädikaten und Aggregaten basierende Lesevorgänge fragen den Index für die entsprechenden Filter ab. Wenn keine Indizes vorhanden sind, führt die Datenbank-Engine eine Dokumentenprüfung durch, um die passenden Dokumente zu finden. Scans sind immer teuer und werden immer teurer, je größer die Datenmenge in einer Sammlung ist. Für eine optimale Abfrageleistung sollten immer Indizes für alle abfragbaren Felder erstellt werden.

Vermeiden unnötiger Indizes und standardmäßiges Indizieren aller Felder

Indizes sollten nur für abfragbare Felder erstellt werden. Die Platzhalterindizierung sollte nur verwendet werden, wenn die Abfragemuster unvorhersehbar sind und jedes Feld in der Dokumentstruktur Teil der Abfragefilter sein kann.

Tipp

Azure Cosmos DB for MongoDB vCore indiziert standardmäßig nur das Feld _id. Alle anderen Felder werden standardmäßig nicht indiziert. Die zu indizierenden Felder sollten im Voraus geplant werden, um die Abfrageleistung zu maximieren und gleichzeitig die Auswirkungen auf die Schreibvorgänge durch die Indizierung zu vieler Felder zu minimieren.

Wenn ein neues Dokument zum ersten Mal eingefügt wird oder ein bestehendes Dokument aktualisiert oder gelöscht wird, wird jedes der angegebenen Felder im Index ebenfalls aktualisiert. Wenn die Indizierungsrichtlinie eine große Anzahl von Feldern (oder alle Felder des Dokuments) enthält, werden vom Server mehr Ressourcen für die Aktualisierung der entsprechenden Indizes verbraucht. Beim Skalieren sollten nur die abfragbaren Felder indiziert werden, während alle anderen Felder, die nicht in Abfrageprädikaten verwendet werden, vom Index ausgeschlossen bleiben sollten.

Erstellen der notwendigen Indizes vor der Datenerfassung

Um eine optimale Leistung zu erzielen, sollten Indizes im Voraus erstellt werden, bevor die Daten geladen werden. Bei allen Schreibvorgängen, Aktualisierungen und Löschungen von Dokumenten werden die entsprechenden Indizes synchron aktualisiert. Wenn Indizes nach der Datenerfassung erstellt werden, werden mehr Serverressourcen für die Indizierung historischer Daten verbraucht. Abhängig von der Größe der historischen Daten ist dieser Vorgang zeitaufwendig und beeinträchtigt die Lese- und Schreibleistung im stabilen Zustand.

Hinweis

Für Szenarien, in denen sich die Lesemuster ändern und Indizes hinzugefügt werden müssen, sollte die Indizierung im Hintergrund aktiviert werden, was Sie über ein Support-Ticket tun können.

Für mehrere Indizes, die auf historischen Daten erstellt werden, geben Sie nicht blockierende createIndex-Befehle für jedes Feld aus

Es ist nicht immer möglich, alle Abfragemuster im Voraus zu planen, vor allem, wenn sich die Anforderungen der Anwendung ändern. Sich ändernde Anwendungsanforderungen erfordern zwangsläufig, dass dem Index auf einem Cluster mit einer großen Menge an historischen Daten Felder hinzugefügt werden.

In solchen Szenarien sollte jeder createIndex-Befehl asynchron erteilt werden, ohne auf eine Antwort des Servers zu warten.

Hinweis

Standardmäßig reagiert Azure Cosmos DB for MongoDB vCore erst dann auf einen createIndex-Vorgang, wenn der Index vollständig auf historischen Daten basiert. Je nach Größe des Clusters und der Menge der eingelesenen Daten kann dies einige Zeit in Anspruch nehmen und so aussehen, als würde der Server nicht auf den Befehl createIndex reagieren.

Wenn die createIndex-Befehle über die Mongo Shell ausgegeben werden, verwenden Sie Strg + C, um den Befehl zu unterbrechen, damit Sie nicht mehr auf eine Antwort warten müssen, sondern die nächsten Vorgänge ausführen können.

Hinweis

Wenn Sie Strg + C verwenden, um den Befehl createIndex zu unterbrechen, nachdem er ausgegeben wurde, wird der Vorgang der Indexerstellung auf dem Server nicht beendet. Die Shell muss nicht mehr auf eine Antwort vom Server warten, während der Server asynchron weiter den Index über die vorhandenen Dokumente aufbaut.

Erstellen zusammengesetzter Indizes für Abfragen mit Prädikaten für mehrere Felder

Zusammengesetzte Indizes sollten in den folgenden Szenarien verwendet werden:

  • Abfragen mit Filtern für mehrere Felder
  • Abfragen mit Filtern für mehrere Felder und mit einem oder mehreren Feldern, die in auf- oder absteigender Reihenfolge sortiert sind

Sehen Sie das das folgende Dokument in der Datenbank „cosmicworks“ und der Sammlung „employee“ an.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7
}

Sehen Sie sich die folgende Abfrage an, um alle Beschäftigten mit dem Nachnamen „Smith“ zu finden, die seit mehr als 5 Jahren im Unternehmen sind:

db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})

Ein zusammengesetzter Index auf „lastName“ und „timeInOrgInYears“ optimiert diese Abfrage:

use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})

Nachverfolgen des Status eines createIndex-Vorgangs

Wenn Indizes hinzugefügt werden und historische Daten indiziert werden müssen, kann der Fortschritt des Vorgangs zur Indexerstellung mit db.currentOp() verfolgt werden.

Anhand dieses Beispiels können Sie den Fortschritt der Indizierung in der Datenbank „cosmicworks“ verfolgen.

use cosmicworks;
db.currentOp()

Wenn ein createIndex-Vorgang ausgeführt wird, sieht die Antwort wie folgt aus:

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

Standardmäßige Aktivierung großer Indexschlüssel

Selbst wenn die Dokumente keine Schlüssel mit einer großen Anzahl von Zeichen enthalten oder die Dokumente nicht mehrere Verschachtelungsebenen aufweisen, wird durch die Angabe großer Indexschlüssel sichergestellt, dass diese Szenarien abgedeckt sind.

Dieses Beispiel zeigt, wie Sie große Indexschlüssel in der Sammlung „large_index_coll“ in der Datenbank „cosmicworks“ aktivieren.

use cosmicworks;
db.runCommand(
{
 "createIndexes": "large_index_coll",
 "indexes": [
    {
        "key": { "ikey": 1 },
        "name": "ikey_1",
        "enableLargeIndexKeys": true
    }
    ]
})

Priorisierung von Indexerstellungen gegenüber neuen Schreibvorgängen mit der Blockierungsoption

Für Szenarien, in denen der Index erstellt werden soll, bevor Daten geladen werden, sollte die Blockierungsoption verwendet werden, um eingehende Schreibvorgänge zu blockieren, bis der Indexaufbau abgeschlossen ist.

Die Einstellung { "blocking": true } ist besonders nützlich in Migrationsprogrammen, bei denen Indizes auf leeren Sammlungen erstellt werden, bevor die Daten geschrieben werden.

Sehen Sie sich ein Beispiel für die Blockierungsoption für die Indexerstellung für die Sammlung „employee“ in der Datenbank „cosmicworks“ an:

use cosmicworks;
db.runCommand({
  createIndexes: "employee",
  indexes: [{"key":{"name":1}, "name":"name_1"}],
  blocking: true
})

Sehen Sie sich die Informationen zur Textindizierung an. Sie ermöglicht effiziente Such- und Abfragevorgänge für textbasierte Daten.

Nächster Schritt