Freigeben über


Bewährte Methoden für die Indizierung in Azure DocumentDB

Für abfragefähige Felder sollten immer Indizes vorhanden sein.

Lesevorgänge basierend auf Prädikaten und Aggregaten konsultieren den Index für die entsprechenden Filter. Wenn keine Indizes vorhanden sind, führt das Datenbankmodul eine Dokumentüberprüfung durch, um die übereinstimmenden Dokumente abzurufen. Scans sind immer teuer und werden immer teurer, da das Datenvolumen in einer Sammlung wächst. Zur optimalen Abfrageleistung sollten Indizes immer für alle abfragbaren Felder erstellt werden.

Vermeiden Sie unnötige Indizes und indizieren Sie standardmäßig alle Felder.

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

Tipp

Azure DocumentDB indiziert standardmäßig nur das feld _id. Alle anderen Felder werden standardmäßig nicht indiziert. Die felder, die indiziert werden sollen, sollten vorab geplant werden, um die Abfrageleistung zu maximieren und gleichzeitig die Auswirkungen auf Schreibvorgänge aus der Indizierung zu vieler Felder zu minimieren.

Wird ein neues Dokument zum ersten Mal eingefügt oder ein vorhandenes Dokument aktualisiert oder gelöscht, werden auch die angegebenen Felder im Index automatisch aktualisiert. Wenn die Indizierungsrichtlinie eine große Anzahl von Feldern (oder alle Felder im Dokument) enthält, werden mehr Ressourcen vom Server verbraucht, um die entsprechenden Indizes zu aktualisieren. Beim Betreiben im großen Maßstab solltest du nur die abfragbaren Felder indizieren, während alle restlichen Felder, die nicht in Abfrage-Prädikaten verwendet werden, nicht im Index enthalten sein sollten.

Indizierungsstrategie für eine effiziente Erfassung von Daten

Bei großen Workloadmigrationen in Azure DocumentDB empfiehlt es sich, Indizes nach dem Laden der Daten für eine effiziente Ausführung zu erstellen. Dadurch wird der Schreibaufwand erheblich reduziert, der Ressourcenverbrauch minimiert und die Datenaufnahmeleistung beschleunigt. Die Aufrechterhaltung von Indizes während der Massenaufnahme kann Einfügungen verlangsamen, da jeder Schreibvorgang alle entsprechenden Indizes aktualisieren muss.

Für mehrere Indizes, die für historische Daten erstellt wurden, führen Sie für jedes Feld nicht blockierende createIndex-Befehle aus.

Es ist nicht immer möglich, alle Abfragemuster vorab zu planen, insbesondere wenn sich die Anwendungsanforderungen weiterentwickeln. Das Ändern der Anwendungsanforderungen erfordert zwangsläufig, dass Felder dem Index auf einem Cluster mit einer großen Menge an historischen Daten hinzugefügt werden.

In solchen Szenarien sollte jeder createIndex-Befehl asynchron ausgegeben werden, ohne auf eine Antwort vom Server zu warten.

Hinweis

Standardmäßig antwortet Azure DocumentDB nur dann auf einen createIndex-Vorgang, nachdem der Index vollständig auf historischen Daten basiert. Je nach Größe des Clusters und dem aufgenommenen Datenvolumen kann dies Zeit in Anspruch nehmen und so aussehen, als ob der Server nicht auf den CreateIndex-Befehl antwortet.

Wenn die createIndex-Befehle über die Mongo-Shell ausgegeben werden, verwenden Sie STRG+C, um den Befehl zu unterbrechen, um das Warten auf eine Antwort zu beenden und den nächsten Satz von Vorgängen auszustellen.

Hinweis

Wenn Sie STRG+C verwenden, um den createIndex-Befehl zu unterbrechen, nachdem er ausgegeben wurde, wird der Indexbuildvorgang auf dem Server nicht beendet. Sie stoppt einfach, dass die Shell auf eine Antwort vom Server wartet, während der Server asynchron den Index über die vorhandenen Dokumente erstellt.

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

Zusammengesetzte Indizes sollten in den folgenden Szenarien verwendet werden:

  • Abfragen mit Filtern in mehreren Feldern
  • Abfragen mit Filtern nach mehreren Feldern und mit einem oder mehreren Feldern, die in aufsteigender oder absteigender Reihenfolge sortiert sind

Betrachten Sie das folgende Dokument aus der "cosmicworks"-Datenbank und der Sammlung "mitarbeiter"

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

Betrachten Sie die folgende Abfrage, um alle Mitarbeiter mit dem Nachnamen "Smith" zu finden, die länger als fünf Jahre bei dem Unternehmen beschäftigt sind.

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

Ein zusammengesetzter Index für "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 Indexbuildvorgangs mithilfe von db.currentOp() nachverfolgt werden.

Betrachten Sie dieses Beispiel, um den Indizierungsfortschritt in der Datenbank der "kosmischen Werke" nachzuverfolgen.

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äßig große Indexschlüssel aktivieren

Auch wenn die Dokumente keine Schlüssel enthalten, die eine große Anzahl von Zeichen enthalten oder die Dokumente nicht mehrere Schachtelungsebenen enthalten, stellt die Angabe großer Indexschlüssel sicher, dass diese Szenarien abgedeckt werden. Jetzt ist der große Indexschlüssel das Standardverhalten der Engine.

Betrachten Sie dieses Beispiel, um große Indexschlüssel für die Sammlung "large_index_coll" in der Datenbank "kosmische Werke" zu aktivieren.

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

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

In Szenarien, in denen der Index vor dem Laden von Daten erstellt werden soll, sollte die Blockierungsoption verwendet werden, um eingehende Schreibvorgänge zu blockieren, bis der Indexbuild abgeschlossen ist.

Die Einstellung { "blocking": true } eignet sich für Migrationshilfsprogramme, bei denen Indizes für leere Sammlungen erstellt werden, bevor Datenschreibvorgänge beginnen.

Betrachten Sie ein Beispiel für die Blockierungsoption für die Indexerstellung in der Sammlung "Mitarbeiter" in der Datenbank "kosmische Werke":

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

Sehen Sie sich die Textindizierung an, die eine effiziente Suche und Abfrage von textbasierten Daten ermöglicht.

Nächster Schritt