sql >> Base de Datos >  >> RDS >> Database

Manejo de la creación de índices con MongoEngine en Python

MongoEngine es un mapeador de documentos de objetos (ODM) para trabajar con MongoDB desde Python. La capa ODM asigna un modelo de objeto a una base de datos de documentos de manera similar a un ORM que asigna un modelo de objeto a una base de datos relacional. Los ODM como MongoEngine ofrecen funciones similares a las de una base de datos relacional, p. cumplimiento de esquema, clave externa, restricción a nivel de campo, etc. a nivel de aplicación.

Hay muchos buenos recursos disponibles para aprender a usar MongoEngine, incluido un tutorial aquí.

En esta publicación, analizaremos una construcción de programación de MongoEngine para crear índices como un tutorial de python de MongoDB y la sobrecarga de rendimiento asociada con ella.

Creación automática de índices en MongoEngine

De forma predeterminada, MongoEngine almacena documentos en una colección que se nombra como la forma plural del nombre de la clase. Por ejemplo, la clase Usuario que se muestra a continuación se almacenará en una colección denominada usuarios. Un modelo debe heredar la clase Documento MongoEngine para convertirse en un objeto asignado.

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

La clase de usuario definida anteriormente declara dos índices:1. nombre (orden de clasificación) y 2. correo electrónico (hash). MongoEngine crea cada índice declarado en la primera operación upsert. Estos índices se crean en la colección a través de una llamada createIndex/ensureIndex . MongoEngine intenta crear estos índices cada vez que se inserta un documento en la colección.
Por ejemplo,

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

Esta llamada da como resultado tres solicitudes de comando al servidor de la base de datos:dos comandos para garantizar que el nombre y el índice de correo electrónico existan en la colección de usuarios, uno para hacer el upsert real.

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

Esto está bien para aplicaciones donde la carga de escritura es de baja a moderada. Sin embargo, si su aplicación requiere mucha escritura, esto tiene un impacto adverso grave en el rendimiento de escritura.

Evitar la creación automática de índices

Si 'auto_create_index' se establece en falso en el metadiccionario, MongoEngine omite la creación automática de índices. No se envían solicitudes adicionales de createIndex durante las operaciones de escritura. Desactivar la creación automática de índices también es útil en los sistemas de producción en los que los índices se aplican normalmente durante la implementación de la base de datos.
Por ejemplo,

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

En caso de que esté diseñando una aplicación de escritura intensiva, tiene sentido decidir sobre sus índices durante la fase de diseño del esquema e implementarlos incluso antes de que se implemente la aplicación. Si planea agregar índices en colecciones existentes, sería mejor seguir la documentación para crear índices en conjuntos de réplicas. Con este enfoque,  desconectamos los servidores de uno en uno y construimos índices     sobre ellos.

Use el método create_index de MongoEngine para crear índices dentro de la aplicación:

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

También puede usar la interfaz de usuario de ScaleGrid para ayudarlo a crear índices de manera continua sin tiempo de inactividad. Para obtener más detalles, consulte nuestra publicación de blog sobre creación de índices de MongoDB.