MongoDB
Indizes
Suche…
Syntax
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
Bemerkungen
Performance Auswirkungen: Beachten Sie, dass Indizes Lese Leistungen zu verbessern, kann aber schlechte Auswirkungen auf die Schreibleistung haben, wie das Einfügen eines Dokuments verlangt , dass alle Indizes zu aktualisieren.
Einzelfeld
db.people.createIndex({name: 1})
Dadurch entsteht eine aufsteigende einzelnes Feld Index auf den Feldnamen.
Bei dieser Art von Indizes ist die Sortierreihenfolge irrelevant, da Mongo den Index in beide Richtungen durchlaufen kann.
Verbindung
db.people.createIndex({name: 1, age: -1})
Dadurch wird ein Index für mehrere Felder erstellt, in diesem Fall für die Felder name
und age
. Es wird im name
aufsteigend und im age
absteigend.
Bei diesem Indextyp ist die Sortierreihenfolge relevant, da er bestimmt, ob der Index eine Sortieroperation unterstützen kann oder nicht. Die umgekehrte Sortierung wird für jedes Präfix eines zusammengesetzten Index unterstützt, sofern die Sortierung in umgekehrter Sortierrichtung für alle Schlüssel in der Sortierung erfolgt. Andernfalls muss die Sortierung nach zusammengesetzten Indizes mit der Reihenfolge des Index übereinstimmen.
Die Reihenfolge der Felder ist ebenfalls wichtig. In diesem Fall wird der Index zuerst nach name
und innerhalb jedes Namenswerts nach den Werten des Felds age
sortiert. Dies ermöglicht es der Index von Abfragen auf dem zu verwendenden name
Feld oder auf name
und age
, aber nicht auf age
allein.
Löschen
Um einen Index zu löschen, können Sie den Indexnamen verwenden
db.people.dropIndex("nameIndex")
Oder das Indexspezifikationsdokument
db.people.dropIndex({name: 1})
Liste
db.people.getIndexes()
Dadurch wird ein Array von Dokumenten zurückgegeben, die jeweils einen Index der Personensammlung beschreiben
Grundlagen zur Indexerstellung
Siehe die untenstehende Transaktionssammlung.
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
Funktionen zeigen alle für eine Collection verfügbaren Indizes an.
db.transactions.getIndexes();
Lassen Sie die Ausgabe der obigen Anweisung sehen.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Es gibt bereits einen Index für die Transaktionserfassung. Dies liegt daran, dass MongoDB während der Erstellung einer Sammlung einen eindeutigen Index für das Feld _id
. Der _id
Index verhindert, dass Clients zwei Dokumente mit demselben Wert für das _id
Feld _id
. Sie können diesen Index nicht im Feld _id
.
Nun fügen wir einen Index für das cr_dr-Feld hinzu.
db.transactions.createIndex({ cr_dr : 1 });
Das Ergebnis der Indexausführung lautet wie folgt.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Die createdCollectionAutomatically gibt an, ob der Vorgang eine Auflistung erstellt hat. Wenn keine Sammlung vorhanden ist, erstellt MongoDB die Sammlung als Teil des Indexierungsvorgangs.
Lassen Sie db.transactions.getIndexes();
nochmal.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
Jetzt sehen Sie, dass die Transaktionssammlung zwei Indizes hat. Standard- _id
Index und cr_dr_1
die wir erstellt haben. Der Name wird von MongoDB vergeben. Sie können Ihren eigenen Namen wie folgt festlegen.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
Jetzt db.transactions.getIndexes();
gibt Ihnen drei Indizes.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Beim Erstellen des Index { cr_dr : -1 }
1 wird der Index in ascending
Reihenfolge und -1 in descending
Reihenfolge { cr_dr : -1 }
.
Hash-Indizes
Indizes können auch als Hash definiert werden. Dies ist bei Gleichheitsabfragen performanter, bei Bereichsabfragen jedoch nicht effizient. Sie können jedoch sowohl gehashte als auch aufsteigende / absteigende Indizes für dasselbe Feld definieren.
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
Index löschen / löschen
Wenn der Indexname bekannt ist,
db.collection.dropIndex('name_of_index');
Wenn der Indexname nicht bekannt ist,
db.collection.dropIndex( { 'name_of_field' : -1 } );
Holen Sie sich Indizes einer Sammlung
db.collection.getIndexes();
Ausgabe
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Eindeutiger Index
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
Eindeutigkeit für den definierten Index erzwingen (entweder einzeln oder zusammengesetzt). Das Erstellen des Index schlägt fehl, wenn die Sammlung bereits doppelte Werte enthält. Die Indizierung schlägt auch fehl, wenn das Feld bei mehreren Einträgen fehlt (da sie alle mit dem Wert null
indiziert werden), sofern nicht sparse: true
angegeben ist.
Sparse-Indizes und Teilindizes
Sparse-Indizes:
Dies kann besonders nützlich für Felder sein, die optional sind, aber auch eindeutig sein sollten.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
Da für zwei Einträge kein "Kurzname" angegeben ist und die Indexierung nicht festgelegte Felder als Nullwert behandelt, schlägt die Indexerstellung mit zwei Dokumenten mit "Nullwert" fehl.
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
werden Sie immer noch 'null' Spitznamen haben.
Sparse-Indizes sind kompakter, da sie Dokumente überspringen / ignorieren, in denen dieses Feld nicht angegeben ist. Wenn Sie also über eine Sammlung verfügen, in der nur weniger als 10% der Dokumente dieses Feld angeben, können Sie wesentlich kleinere Indizes erstellen. So können Sie den begrenzten Speicher besser nutzen, wenn Sie Abfragen wie:
db.scores.find({'nickname': 'Johnnie'})
Teilindizes:
Teilindizes stellen eine Obermenge der von Sparse-Indizes gebotenen Funktionalität dar und sollten gegenüber Sparse-Indizes bevorzugt werden. ( Neu in Version 3.2 )
Teilindizes bestimmen die Indexeinträge basierend auf dem angegebenen Filter.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Ist die rating
größer als 5, wird die cuisine
indexiert. Ja, wir können auch eine Eigenschaft angeben, die basierend auf dem Wert anderer Eigenschaften indiziert werden soll.
Unterschied zwischen Sparse- und Teilindizes:
Sparse-Indizes wählen die zu indizierenden Dokumente ausschließlich auf der Grundlage des Vorhandenseins des indizierten Feldes oder bei zusammengesetzten Indizes das Vorhandensein der indizierten Felder aus.
Teilindizes bestimmen die Indexeinträge basierend auf dem angegebenen Filter. Der Filter kann andere Felder als die Indexschlüssel enthalten und kann andere Bedingungen als nur eine Existenzprüfung angeben.
Ein Teilindex kann jedoch dasselbe Verhalten wie ein Index mit geringer Dichte implementieren
Z.B:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
Anmerkung: Die Option partialFilterExpression und die Option " Sparse " können nicht gleichzeitig angegeben werden.