Neben den oben genannten grundlegenden Methoden zur Queryanalyse bietet MongoDB zusätzliche fortgeschrittene Werkzeuge und Techniken, um tiefergehende Einblicke in Abfrageleistung und Datenbankverhalten zu erhalten.
Mit explain() können Sie die Effizienz eines Indexes bei
bestimmten Abfragen überprüfen:
db.meineSammlung.find({ name: "Max" }).hint({ name: 1 }).explain("executionStats");hint(): Erzwingt die Verwendung eines
bestimmten Indexes, um die Auswirkungen verschiedener Indizes zu
testen.totalKeysExamined: Anzahl der gescannten
Indexeinträge.totalDocsExamined: Anzahl der Dokumente, die aufgrund
des Indexscans geprüft wurden.Vergleichen Sie diese Werte mit denen eines Collection-Scans
(COLLSCAN), um die Indexeffizienz zu bewerten.
MongoDB bietet ab Version 4.2 die Möglichkeit, Profildaten über
Aggregationsabfragen direkt aus der
system.profile-Collection abzurufen.
Beispiel: Identifizieren Sie die langsamsten Abfragen:
db.system.profile.aggregate([
{ $match: { millis: { $gt: 100 } } },
{ $sort: { millis: -1 } },
{ $limit: 5 }
]);MongoDB unterstützt benchRun, eine Methode, um bestimmte
Abfragen und Schreibvorgänge in einer Testumgebung zu simulieren.
Beispiel: Testen Sie eine Abfrage mit mehreren Threads und Wiederholungen:
benchRun({
ops: [
{ op: "find", ns: "meineDatenbank.meineSammlung", query: { typ: "KI" } }
],
parallel: 5,
seconds: 10
});Dies liefert Metriken wie Durchsatz und Latenz, die für die Optimierung nützlich sind.
Für Aggregationsabfragen können Sie das
explain()-Feature verwenden, um die Effizienz einzelner
Pipeline-Phasen zu analysieren.
Beispiel: Analyse einer komplexen Aggregationsabfrage:
db.meineSammlung.aggregate([
{ $match: { typ: "KI" } },
{ $group: { _id: "$typ", count: { $sum: 1 } } }
]).explain("executionStats");nReturned: Anzahl der zurückgegebenen Dokumente.executionStages: Zeigt die Zeit und Ressourcen für jede
Pipeline-Phase.Ein “Covering Index” ist ein Index, der alle angeforderten Felder einer Abfrage abdeckt, sodass kein Zugriff auf die eigentlichen Dokumente erforderlich ist.
Beispiel: Abfrage mit Covering Index:
db.meineSammlung.createIndex({ name: 1, typ: 1 });
db.meineSammlung.find({ name: "Max" }, { name: 1, typ: 1, _id: 0 }).explain("executionStats");Das stage: "IXSCAN" im explain()-Output
zeigt, dass die Abfrage nur den Index verwendet.
MongoDB stellt leistungsstarke Tools zur Verfügung, die es
ermöglichen, komplexe Abfragen zu analysieren, Engpässe zu
identifizieren und Optimierungen effizient umzusetzen. Durch die
Kombination von explain(), Indexanalyse, Benchmarks und
Profiler können Sie Ihre Abfragen und die gesamte Datenbankleistung
gezielt verbessern.