38 Index Metriken

38.1 1. Abfrageanalyse mit db.collection.explain()

MongoDB bietet die Möglichkeit, eine Abfrageanalyse durchzuführen, um zu sehen, ob Indizes verwendet werden, welche Art von Zugriff (Indexscan vs. Collection-Scan) stattfindet und wie effizient die Abfrage ist.

db.collection.find({ fieldName: value }).explain("executionStats")

38.2 2. Indexstatistiken mit db.collection.aggregate()

MongoDB sammelt Nutzungsstatistiken für jeden Index. Mit der aggregate()-Pipeline kannst du auf diese Daten zugreifen.

db.collection.aggregate([
  { $indexStats: {} }
])

Beispiel: Wenn ein Index eine geringe Zugriffszahl hat, könnte das ein Kandidat für die Entfernung sein.

38.3 3. Serverstatistiken mit db.serverStatus()

Der Befehl db.serverStatus() gibt einen Überblick über die Performance der Datenbank, einschließlich Metriken zu Abfragen und Indexzugriffen.

db.serverStatus().metrics.query

Ein hoher Anteil an Collection-Scans deutet darauf hin, dass für einige Abfragen relevante Indizes fehlen.

38.4 4. Kapitäns-Analyse: Slow Queries mit Profiler

MongoDB enthält einen Profiler, der langsame Abfragen (Slow Queries) protokolliert. Diese können verwendet werden, um potenziell ineffiziente Abfragen zu identifizieren.

38.4.0.1 Aktivierung des Profilers:

db.setProfilingLevel(1, { slowms: 100 })

38.4.0.2 Abruf der Profiling-Daten:

db.system.profile.find().sort({ ts: -1 })

38.5 5. listIndexes zur Verwaltung bestehender Indizes

Der Befehl listIndexes zeigt alle vorhandenen Indizes in einer Sammlung an. Du kannst überprüfen, ob ein Index redundant oder unnötig ist.

db.collection.getIndexes()

Beispiel: Wenn mehrere Indizes auf dieselben Felder zugreifen (z. B. { field1: 1 } und { field1: 1, field2: -1 }), könnte der erste redundant sein.

38.6 6. Index-Speichernutzung analysieren

Die Speichernutzung von Indizes kann ebenfalls eine Entscheidungshilfe sein. Zu viele oder große Indizes können den RAM belasten.

db.collection.stats()

Große Indizes, die selten verwendet werden, sind Kandidaten für die Entfernung.

38.7 Entscheidungsstrategie

  1. Nutze db.collection.explain(), um häufige Abfragen zu analysieren.
  2. Überprüfe mit $indexStats, welche Indizes aktiv genutzt werden.
  3. Finde ineffiziente oder nicht genutzte Indizes, indem du ihre Zugriffszahlen und Speicherverbrauch vergleichst.
  4. Analysiere langsame Abfragen mit dem Profiler, um fehlende Indizes zu identifizieren.
  5. Entferne redundante oder selten genutzte Indizes, um Schreiboperationen und RAM-Auslastung zu optimieren.