Database
 sql >> Datenbank >  >> RDS >> Database

Handhabung der Indexerstellung mit MongoEngine in Python

MongoEngine ist ein Object Document Mapper (ODM) für die Arbeit mit MongoDB aus Python. Die ODM-Schicht ordnet ein Objektmodell einer Dokumentendatenbank zu, ähnlich wie ein ORM ein Objektmodell einer relationalen Datenbank zuordnet. ODMs wie MongoEngine bieten relationale datenbankähnliche Funktionen, z. Schemadurchsetzung, Fremdschlüssel, Beschränkung auf Feldebene usw. auf Anwendungsebene.

Viele gute Ressourcen sind verfügbar, um die Verwendung von MongoEngine zu lernen, einschließlich eines Tutorials hier.

In diesem Beitrag besprechen wir ein MongoEngine-Programmierkonstrukt zum Erstellen von Indizes als MongoDB-Python-Tutorial und den damit verbundenen Leistungsaufwand.

Automatische Indexerstellung in MongoEngine

Standardmäßig speichert MongoEngine Dokumente in einer Sammlung, die als Pluralform des Klassennamens benannt ist. Beispielsweise wird die unten gezeigte Benutzerklasse in einer Sammlung namens Benutzer gespeichert. Ein Modell sollte die MongoEngine-Klasse Document erben, um ein zugeordnetes Objekt zu werden.

class User(Document):
    meta = {        
	'indexes': [
	{
	     'fields': ['+name']	               
	},
	{
	     'fields': ['#email']
	}]             
    }	

Die oben definierte Benutzerklasse deklariert zwei Indizes:1. Name (Sortierreihenfolge) und 2. E-Mail (gehasht). MongoEngine erstellt jeden deklarierten Index bei der ersten Upsert-Operation. Diese Indexe werden für die Sammlung über einen createIndex/ensureIndex-Aufruf erstellt . MongoEngine versucht, diese Indizes jedes Mal zu erstellen, wenn ein Dokument in die Sammlung eingefügt wird.
Zum Beispiel

User(name = "Ross", email='[email protected]",address="127,Baker Street").save()

Dieser Aufruf ergibt drei Befehlsanforderungen an den Datenbankserver:zwei Befehle, um sicherzustellen, dass Name und E-Mail-Index in der Benutzersammlung vorhanden sind, eins um den eigentlichen Upsert durchzuführen.

COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "name_1", key: { name: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms
COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "email_hashed", key: { email: "hashed" } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms
COMMAND [conn8640] command admin.user command: insert { insert: "user", ordered: true, documents: [ { name: "Ross", email: "[email protected]", address: "127, Baker Street", _id: ObjectId('584419df01f38269dd9d63c1') } ], writeConcern: { w: 1 } } ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms

Dies ist für Anwendungen mit geringer bis mittlerer Schreiblast in Ordnung. Wenn Ihre Anwendung jedoch schreibintensiv ist, hat dies schwerwiegende negative Auswirkungen auf die Schreibleistung.

Vermeiden der automatischen Indexerstellung

Wenn 'auto_create_index' auf false gesetzt ist im Meta-Wörterbuch, dann überspringt MongoEngine die automatische Erstellung von Indizes. Während Schreibvorgängen werden keine zusätzlichen createIndex-Anforderungen gesendet. Das Deaktivieren der automatischen Indexerstellung ist auch in Produktionssystemen nützlich, in denen Indizes normalerweise während der Datenbankbereitstellung angewendet werden.
Zum Beispiel

meta = {
		'auto_create_index':false,
		'indexes': [
		        .....
        	]
       }

Falls Sie eine schreibintensive Anwendung entwerfen, ist es sinnvoll, während der Schemaentwurfsphase über Ihre Indizes zu entscheiden und sie bereitzustellen, noch bevor die Anwendung bereitgestellt wird. Wenn Sie planen, Indizes zu vorhandenen Sammlungen hinzuzufügen, ist es besser, der Dokumentation zu folgen, um Indizes für Replikatsätze zu erstellen. Bei diesem Ansatz fahren wir die Server einzeln herunter und erstellen Indizes     auf ihnen.

Verwenden Sie die Methode create_index von MongoEngine, um Indizes innerhalb der Anwendung zu erstellen:

User.create_index(keys, background=False, **kwargs)

Sie können auch die ScaleGrid-Benutzeroberfläche verwenden, um Ihnen dabei zu helfen, Indizes auf „rollierende Weise“ ohne Ausfallzeiten zu erstellen. Weitere Einzelheiten finden Sie in unserem Blogbeitrag zur MongoDB-Indexerstellung.