tutorial instead indexes index ensureindex deprecationwarning createindexes create collection mongodb indexing

instead - Mongodb: ¿cuándo llamar a ensureIndex?



mongodb index types (7)

No importa, pero solo tienes que hacer esto una vez. Si desea insertar por lotes una gran cantidad de datos en una colección vacía, entonces es mejor crear el índice después de las inserciones, pero de lo contrario no importa.

¿Cuándo debo llamar a ensureIndex? Antes de insertar un solo registro, después de insertar un solo registro, o antes de llamar a find ()?

Saludos,

Johnny


Normalmente coloco mis llamadas a ensureIndex() dentro de un bloque init para la parte de mi aplicación que gestiona la comunicación con MongoDB. Además, ensureIndex() esas llamadas a ensureIndex() dentro de un cheque para ver si existe una colección que sé que debe existir para que la aplicación funcione; de esta forma, las llamadas a ensureIndex () solo se llaman una vez, nunca, la primera vez que se ejecuta la aplicación contra una instancia de MongoDB específica.

He leído en otra parte una opinión en contra de poner llamadas a ensureIndex () en el código de la aplicación, ya que otros desarrolladores pueden cambiarlas y alterarlas por error (los índices), pero envolverlo en un cheque para la existencia de una colección ayuda a evitarlo.

Ejemplo del controlador de Java MongoDB:

DB db = mongo.getDB("databaseName"); Set<String> existingCollectionNames = db.getCollectionNames(); // init collections; ensureIndexes only if creating collection // (let application set up the db if it''s not already) DBCollection coll = db.getCollection("collectionName"); if (!existingCollectionNames.contains("collectionName")) { // ensure indexes... coll.ensureIndex(BasicDBObjectBuilder.start().add("date", 1).get()); // ... }


Parece que mi comentario ha sido un poco incomprendido, así que lo aclararé. Realmente no importa cuando lo llames siempre que se llame en algún momento antes de llamar a find () por primera vez. En otras palabras, realmente no importa cuando crea el índice, siempre que esté allí antes de que espere usarlo.

Un patrón común que he visto mucho es codificar el ensureIndex al mismo tiempo (y en el mismo lugar) que la llamada a find() . ensureIndex comprobará si el índice existe y lo creará si no. Sin duda, hay una sobrecarga (aunque muy pequeña) en llamar al índice de seguridad antes de llamar a find (), por lo que es preferible no hacer esto.

Llamo ensureIndex en el código para simplificar las implementaciones y para evitar tener que administrar el db y la base de código por separado. La compensación de la facilidad de implementación equilibra la redundancia de llamadas posteriores a ensureIndex (para mí)


Recomiendo llamar a ensureIndex una vez, cuando comience su aplicación.


Sólo necesitas hacer esto una vez. Ejemplo:

db.table.insert({foo: ''bar''}); var foo = db.table.findOne({foo: ''bar''}); // => delivered from FS, not RAM db.table.ensureIndex({foo: 1}); var foo = db.table.findOne({foo: ''bar''}); // => delivered from RAM, not FS db.table.insert({foo: ''foo''}); var foo = db.table.findOne({foo: ''foo''}); // => delivered from RAM, not FS


Si agrega un índice de antemano, cada llamada de inserción / actualización / eliminación debe modificar también cada índice. Por lo tanto, desde un punto de vista de optimización, es probable que desee posponerlo el mayor tiempo posible antes de emitir consultas. Sin embargo, desde un punto de vista funcional, no importa.


Si tiene una colección que tiene millones de registros y está compilando varios índices compuestos con autoindexación desactivada, entonces DEBE asegurarse de estar invocando ensureIndexes () mucho antes de su primera consulta de búsqueda, posiblemente sincrónicamente, es decir, después de que el método ensureIndexes devuelva.

El modo (primer plano frente a fondo) en el que se crean los índices agrega complejidad adicional. El modo de primer plano bloquea el db completo mientras crea los índices, mientras que el modo de fondo le permite consultar el db. Sin embargo, el modo de fondo de la creación del índice lleva más tiempo.

Por lo tanto, debe asegurarse de que los índices se hayan creado correctamente. Puede usar db.currentOp () para verificar el progreso de ensureIndexes () mientras todavía está creando índices.