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

Gestione della creazione di indici con MongoEngine in Python

MongoEngine è un Object Document Mapper (ODM) per lavorare con MongoDB da Python. Il livello ODM associa un modello a oggetti a un database di documenti in modo simile a un ORM che mappa un modello a oggetti a un database relazionale. Gli ODM come MongoEngine offrono funzionalità simili a database relazionali, ad es. imposizione dello schema, chiave esterna, vincolo a livello di campo ecc. a livello di applicazione.

Sono disponibili molte buone risorse per apprendere l'uso di MongoEngine, incluso un tutorial qui.

In questo post, discuteremo un costrutto di programmazione MongoEngine per la creazione di indici come tutorial python MongoDB e il sovraccarico di prestazioni ad esso associato.

Creazione automatica dell'indice in MongoEngine

Per impostazione predefinita, MongoEngine archivia i documenti in una raccolta denominata come forma pluralizzata del nome della classe. Ad esempio, la classe User mostrata di seguito verrà archiviata in una raccolta denominata users. Un modello dovrebbe ereditare la classe MongoEngine Document per diventare un oggetto mappato.

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

La classe User definita sopra dichiara due indici:1. name (ordinamento) e 2. email (hashing). MongoEngine crea ogni indice dichiarato alla prima operazione di upsert. Questi indici vengono creati sulla raccolta tramite una chiamata createIndex/ensureIndex . MongoEngine tenta di creare questi indici ogni volta che un documento viene inserito nella raccolta.
Ad es.

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

Questa chiamata risulta in tre richieste di comando al server del database:due comandi per garantire che il nome e l'indice email esistano nella raccolta degli utenti, uno per fare l'upsert vero e proprio.

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

Questo va bene per le applicazioni in cui il carico di scrittura è da basso a moderato. Tuttavia, se la tua applicazione è ad alta intensità di scrittura, ciò ha un grave impatto negativo sulle prestazioni di scrittura.

Evitare la creazione automatica dell'indice

Se 'auto_create_index' è impostato su falso nel meta-dizionario, quindi MongoEngine salta la creazione automatica degli indici. Nessuna richiesta createIndex aggiuntiva viene inviata durante le operazioni di scrittura. La disattivazione della creazione automatica degli indici è utile anche nei sistemi di produzione in cui gli indici vengono applicati in genere durante la distribuzione del database.
Ad esempio,

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

Nel caso in cui si stia progettando un'applicazione ad alta intensità di scrittura, ha senso decidere gli indici durante la fase di progettazione dello schema e distribuirli anche prima della distribuzione dell'applicazione. Se si prevede di aggiungere indici a raccolte esistenti, sarebbe meglio seguire la documentazione per creare l'indice su un set di repliche. Utilizzando questo approccio,  abbattiamo i server uno alla volta e creiamo indici     su di essi.

Usa il metodo create_index di MongoEngine per creare indici all'interno dell'applicazione:

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

Puoi anche utilizzare l'interfaccia utente di ScaleGrid per aiutarti a creare indici in "modalità mobile" senza tempi di inattività. Per maggiori dettagli, fare riferimento al nostro post sul blog sulla creazione di indici MongoDB.