Índices

Añadir los índices apropiados en colecciones grandes, permite escanear los datos con un número menor de consultas, lo que reduce el tiempo y mejora el rendimiento.

Para crear índices, como por ejemplo, en la colección “paciente”, crear un índice ascendente por centro y descendente por nombre del paciente, podríamos hacer lo siguiente:

Para descubrir los índices que hay en una base de datos, ejecutaríamos:

Para conocer los índices en una colección determinada:

Para eliminar un índice determinado:

Índices con varias claves (multikey index)

Si tenemos un documento como el siguiente:

Y creamos un índice sobre la propiedad “deportes”, en realidad, lo que estamos haciendo es crear un multiíndice. En este tipo de índices, se pueden insertar propiedades, con la condición de que no se intente insertar en paralelo más de un multiíndice, ya que se produciría un error.

Índice único y eliminación de duplicados (dropDups)

Para crear índices únicos, es decir, que no permitan valores repetidos, hay que poner a “true” el atributo “unique” como segundo argumento:

El segundo parámetro “dropDups:true” indica que si existe en la colección algún elemento duplicado para ese índice, que lo elimine. Esto borrará los elementos duplicados, solo que no sabremos que elementos dejará y cuales no.

Índices “escasos” (sparse Index)

Supongamos que tenemos una colección, en el que algunos elementos tienen la propiedad title y otros no. Los que no tengan la propiedad, es como si tuvieran dicha propiedad a null. Esto quiere decir, que si queremos poner un ińdice único en dicha propiedad y hay más de un elemento que no la tiene, no nos va a dejar, a no ser que indiquemos lo siguiente: sparse:1

Esto crea un indice, con los elementos que tengan dicha propiedad, los que no la tengan, es como si no existiesen. De modo que si buscamos todos los elementos de la colección y los ordenamos por la propiedad “nombre”, únicamente nos mostraría los que tengan esa propiedad. No los encontraría aunque busquemos con:

Ya que no se encuentran en el índice los elementos que no poseen dicha propiedad.

Índices en primer y en último plano

Los índices se pueden crear en primer plano, lo que bloquea la base de datos y tarda menos en hacerse, o bien, en segundo plano (con la opción backgrownd:true), lo que tarda más tiempo, pero no bloquea la base de datos.

Usando “explain”

Añadiendo en una consulta la sentencia .explain(), recuperamos lo que tarda la consulta, los índices que usa, etc.:

Los índices ocupan espacio en disco, más aún si son índices multiclave.

Eligiendo índices con “hint”

Se puede indicar el índice que queremos usar en la consulta de este modo:

En Java (veremos los drivers de Java más adelante, pero como adelanto…) se utiliza la misma función, se le pasa un string con el nombre del índice a utilizar, o bien, un BasicDBObject con los indices a utilizar:

Índices geoespaciales

Si nos estamos moviendo en coordenadas x e y, podemos definir índices, que nos permitan obtener, que puntos están más cerca de unas determinadas coordenadas, de este modo:

En este caso estamos limitando los resultados a los 3 lugares más próximos. El índice se definiría de este modo:

Perfiles

Hay tres perfiles de ejeccución en mongo del 0 al 2, que lo que hacen es sacar trazas de logs en las consultas que tardan mucho tiempo.

También se pueden hacer consultas para conocer el perfil de las consultas que se han hecho en el sistema y que han tardado más de un determinado tiempo, ordenado por timestamp descendente:

Mongotop y mongostat

Si en la consola de mongo introduces “mongotop 3”, (seguida de los segundos que quieres que transcurran entre cada ejecución de dicho comando), se nos mostrará en que emplea su tiempo la base de datos mongo, es decir, cuanto está empleando en leer, cuanto en escribir. Podemos escribir la sentencia “mongostat” para conocer estadísticas de la base de datos, como insert por segundo, querys por segundo, etc.

Aquí terminamos éste artículo, en el próximo artículo hablaremos sobre funciones de agregación

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *