sql >> Database teknologi >  >> RDS >> Database

Håndtering af indeksoprettelse med MongoEngine i Python

MongoEngine er en Object Document Mapper (ODM) til at arbejde med MongoDB fra Python. ODM-laget kortlægger en objektmodel til en  dokumentdatabase på en måde, der ligner en ORM  mapping af en objektmodel til en relationsdatabase. ODM'er som MongoEngine tilbyder relationelle databaselignende funktioner, f.eks. skemahåndhævelse, fremmednøgle, begrænsning på feltniveau osv. på applikationsniveau.

Mange gode ressourcer er tilgængelige for at lære brugen af ​​MongoEngine, inklusive et selvstudie her.

I dette indlæg vil vi diskutere en MongoEngine-programmeringskonstruktion til oprettelse af indekser som en MongoDB python-tutorial og den ydeevne, der er forbundet med den.

Automatisk indeksoprettelse i MongoEngine

Som standard gemmer MongoEngine dokumenter i en samling, der er navngivet som flertalsformen af ​​klassenavnet. For eksempel vil brugerklassen vist nedenfor blive gemt i en samling med navnet brugere. En model skal arve MongoEngine-klassens dokument for at blive et kortlagt objekt.

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

Brugerklassen defineret ovenfor erklærer to indekser:1. navn (sorteringsrækkefølge) og 2. e-mail (hashed). MongoEngine opretter hvert deklarerede indeks ved den første upsert-operation. Disse indekser oprettes på samlingen via et createIndex/ensureIndex-kald . MongoEngine forsøger at oprette disse indekser, hver gang et dokument indsættes i samlingen.
For f.eks.

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

Dette opkald resulterer i tre kommandoanmodninger til databaseserver:to kommandoer for at sikre, at navn og e-mail-indeks findes på brugernes samling, én at lave selve upsert.

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

Dette er ok for applikationer, hvor skrivebelastningen er lav til moderat. Men hvis din ansøgning er skriveintensiv, har dette en alvorlig negativ indvirkning på skriveydelsen.

Undgå automatisk indeksoprettelse

Hvis 'auto_create_index' er indstillet til falsk i metaordbogen, så springer MongoEngine over den automatiske oprettelse af indekser. Der sendes ingen ekstra createIndex-anmodninger under skriveoperationer. Deaktivering af automatisk indeksoprettelse er også nyttigt i produktionssystemer, hvor indekser typisk anvendes under databaseimplementering.
F.eks.

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

I tilfælde af at du designer en skriveintensiv applikation, giver det mening at tage stilling til dine indekser under skemadesignfasen og implementere dem, selv før applikationen implementeres. Hvis du planlægger at tilføje indekser på eksisterende samlinger, ville det være bedre at følge dokumentationen for at bygge indeks på replikasæt. Ved at bruge denne tilgang  nedbringer vi serverne én ad gangen og bygger indekser     på dem.

Brug MongoEngine create_index-metoden til at oprette indekser i applikationen:

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

Du kan også bruge ScaleGrid-brugergrænsefladen til at hjælpe dig med at bygge indekser på en 'rullende måde' uden nedetid. For flere detaljer henvises til vores MongoDB indeksbygning blogindlæg.


  1. MySQL &MariaDB Database Backup Ressourcer

  2. Konverter DateTime til MySQL ved hjælp af C#

  3. Sådan opretter du en tabel med en fremmednøgle i SQL

  4. Sammenligning af datointervaller