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
})
Zugehöriger Inhalt
Sehen Sie sich die Informationen zur Textindizierung an. Sie ermöglicht effiziente Such- und Abfragevorgänge für textbasierte Daten.