MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

3 Möglichkeiten, einen Index aus dem Abfrageplan in MongoDB auszublenden

Ab MongoDB 4.4 können wir jetzt Indizes aus dem Abfrageplan ausblenden. Dadurch können wir die potenziellen Auswirkungen des Löschens eines Index bewerten, ohne den Index tatsächlich zu löschen.

Wenn das Ausblenden negative Auswirkungen hat, können wir den Index einblenden. Dadurch müssen wir den Index nicht löschen und dann erneut erstellen.

Im Folgenden finden Sie 3 Möglichkeiten, einen Index in MongoDB auszublenden.

Der hideIndex() Methode

Der db.collection.hideIndex() -Methode tut genau das, was sie verspricht – sie verbirgt den Index (vor dem Abfrageplaner).

Beispiel:

db.pets.hideIndex("idx_weight_-1")

Ausgabe:

{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

Das verbirgt einen Index namens idx_weight_-1 auf den pets Sammlung. Wir könnten alternativ das Schlüsselmuster für den Index anstelle des Namens angeben.

Die Ausgabe von hideIndex() Methode zeigt den alten Wert für hidden an Feld (in diesem Fall false ) und den neuen Wert (in diesem Fall true ).

Wenn wir jedoch einen bereits ausgeblendeten Index ausblenden (oder einen bereits eingeblendeten einblenden), werden diese nicht angezeigt, und wir erhalten nur Folgendes:

{ "ok" : 1 }

In jedem Fall ist der Index jetzt ausgeblendet.

Der hideIndex() -Methode ist eigentlich ein Wrapper für collMod Verwaltungsbefehl (unten).

Der collMod Befehl

Das collMod Verwaltungsbefehl ermöglicht es uns, Optionen zu einer Sammlung hinzuzufügen oder Ansichtsdefinitionen zu ändern.

Wir können es verwenden, um einen Index zu verbergen, indem wir hidden: true übergeben .

Beispiel:

db.runCommand( {
   collMod: "pets",
   index: {
      name: "idx_weight_-1",
      hidden: true
   }
} )

Ergebnis:

{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

Dies gibt dasselbe Dokument wie hideIndex() zurück zurück.

Ähnlich wie hideIndex() haben Sie die Möglichkeit, den Indexnamen oder sein Schlüsselmuster anzugeben.

Hier ist ein Beispiel für die Verwendung des Schlüsselmusters:

db.runCommand( {
   collMod: "pets",
   index: {
      keyPattern: { weight : -1 },
      hidden: true
   }
} )

In diesem Fall wurde der Index mit { weight : -1 } definiert , daher kann diese Definition anstelle des Indexnamens verwendet werden.

Um dies zu überprüfen, können wir getIndexes() verwenden um die Definition des Index zu sehen:

db.pets.getIndexes()

Ergebnis:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	}
]

Wir können den Index auch sichtbar machen, indem wir hidden: false übergeben .

Erstellen Sie einen versteckten Index

Die dritte Möglichkeit, einen Index zu verbergen, besteht darin, ihn als versteckten Index zu erstellen.

Verwenden Sie dazu hidden: true als eine der Optionen, wenn Sie den Index erstellen.

Beispiel:

db.pets.createIndex( 
    { type: 1 },
    { hidden: true }
)

Ausgabe:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}

Rufen wir nun getIndexes() auf erneut, um unseren neu erstellten versteckten Index zu überprüfen:

db.pets.getIndexes()

Ergebnis:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	},
	{
		"v" : 2,
		"hidden" : true,
		"key" : {
			"type" : 1
		},
		"name" : "type_1"
	}
]

Wir können sehen, dass es mit "hidden": true erstellt wurde .

Können Indizes nicht ausgeblendet werden? Überprüfen Sie diese Einstellung.

Der mongod featureCompatibilityVersion muss mindestens 4.4 sein bevor Sie Indizes ausblenden können. Ein einmal ausgeblendeter Index bleibt jedoch auch mit featureCompatibilityVersion ausgeblendet auf MongoDB 4.4-Binärdateien auf 4.2 gesetzt.

Sie können die featureCompatibilityVersion überprüfen Einstellung mit folgendem Code:

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Sie können es mit setFeatureCompatibilityVersion festlegen Befehl:

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

Die setFeatureCompatibilityVersion Der Befehl muss im admin ausgeführt werden Datenbank.

Beachten Sie auch, dass Sie die _id nicht ausblenden können index.