Database
 sql >> Base de données >  >> RDS >> Database

Gestion de la création d'index avec MongoEngine en Python

MongoEngine est un Object Document Mapper (ODM) pour travailler avec MongoDB à partir de Python. La couche ODM mappe un modèle d'objet à une base de données de documents de la même manière qu'un ORM mappe un modèle d'objet à une base de données relationnelle. Les ODM comme MongoEngine offrent des fonctionnalités de type base de données relationnelle, par ex. application du schéma, clé étrangère, contrainte au niveau du champ, etc. au niveau de l'application.

De nombreuses bonnes ressources sont disponibles pour apprendre à utiliser MongoEngine, y compris un tutoriel ici.

Dans cet article, nous discuterons d'une construction de programmation MongoEngine pour la création d'index sous la forme d'un didacticiel python MongoDB et de la surcharge de performances qui y est associée.

Création automatique d'index dans MongoEngine

Par défaut, MongoEngine stocke les documents dans une collection nommée sous la forme plurielle du nom de la classe. Par exemple, la classe User illustrée ci-dessous sera stockée dans une collection nommée users. Un modèle doit hériter de la classe MongoEngine Document pour devenir un objet mappé.

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

La classe User définie ci-dessus déclare deux index :1. nom (ordre de tri) et 2. email (haché). MongoEngine crée chaque index déclaré lors de la première opération d'upsert. Ces index sont créés sur la collection via un appel createIndex/ensureIndex . MongoEngine tente de créer ces index chaque fois qu'un document est inséré dans la collection.
Par exemple

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

Cet appel aboutit à trois requêtes de commande au serveur de base de données :deux commandes pour s'assurer que l'index des noms et des e-mails existe sur la collection d'utilisateurs, un pour faire le véritable 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

Cela convient aux applications où la charge d'écriture est faible à modérée. Cependant, si votre application est intensive en écriture, cela a un impact négatif sérieux sur les performances d'écriture.

Éviter la création automatique d'index

Si 'auto_create_index' est défini sur faux dans le méta-dictionnaire, alors MongoEngine ignore la création automatique des index. Aucune requête createIndex supplémentaire n'est envoyée pendant les opérations d'écriture. La désactivation de la création automatique d'index est également utile dans les systèmes de production où les index sont généralement appliqués lors du déploiement de la base de données.
Par exemple,

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

Dans le cas où vous concevez une application intensive en écriture, il est logique de décider de vos index pendant la phase de conception du schéma et de les déployer avant même que l'application ne soit déployée. Si vous envisagez d'ajouter des index sur des collections existantes, il serait préférable de suivre la documentation pour créer un index sur un jeu de répliques. En utilisant cette approche, nous arrêtons les serveurs un par un et créons des index sur eux.

Utilisez la méthode MongoEngine create_index pour créer des index dans l'application :

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

Vous pouvez également utiliser l'interface utilisateur de ScaleGrid pour vous aider à créer des index de manière "glissante" sans temps d'arrêt. Pour plus de détails, consultez notre article de blog sur la création d'index MongoDB.