[hoMONGOus DB]Índices, profiling en Mongo DB – II

En la anterior entrada sobre MongoDb e índices, empezamos por explicar las principales características de estos elementos en Mongo. A lo largo de la siguiente entrada, intentaremos profundizar un poco más en indices y profiling.

Al igual que existe en otras bases de datos relacionales y nosql, mongodb dispone de un sistema para forzar a las consultas a utilizar un determinado índice, algo que por regla general se conoce como un hint. Esta misma palabra es la que se utiliza en MongoDb y su uso es tan simple como se ve en la siguiente figura:

pic5

En código en C# el mismo trabajo que el de la figura anterior sería el siguiente:

 

Realmente, hacer un hint, suele ser innecesario, puesto que el optimizador de consultas suele elegir la mejor manera de ejecutar una consulta de entre la eleccion de distintos planes de ejecución.

Para los que conozcais MongoDb, sabreis que esta base de datos documental dispone de soporte para datos geoespaciales, y por lo tanto, los indices también se pueden crear sobre este tipo de datos, así por ejemplo para crear un indice geoespacial sobre una clave llamada gps bastaría con realizar lo siguiente db.mapa.ensureIndex({“gps”:”2d”}) dónde el  valor de la clave 2d es obligatorio para indicar que es un índice geoespacial. Una vez creado este índice, las consultas geoespaciales podrán hacer uso del mismo, db.mapa.find({“gps”,{“$near”:[40,100]}}).

Hasta ahora, tanto en esta entrada como en la entrada anterior hemos visto el trabajo con indices en MongoDB, por supuesto, el uso de indices, como también en cualquier base de datos relacional, nos permite acelerar nuestras consultas sobremanera. Sin embargo, realmente, hasta ahora no sabemos como ver cuales son las consultas costosas  en una base de datos de mongodb.  Para hacer este trabajo, MongoDb nos permite establecer un nivel de profiling, por defecto desactivado. Este nivel de profiling, que podemos ver mediante la función db.getProfilingLevel(), se puede modificar mediante la función setProfilingLevel, método que acepta dos parámetros ( el nivel de profiling y el tiempo minimo), así por ejemplo si ejecutamos

db.setPRofilingLevel(1,100) estaremos ordenando logear las consultas cuyo tiempo de ejecución sea superior a los 100 ms ( consultas consideradas lentas por defecto ). Si queremos logear todas las operaciones, basta con indicar como valor 2 el primero de los parámetros de la función, db.setProfilingLevel(2).

 

Una vez que hemos activado el profiling, podemos revisar la información dentro de la colección db.system.profile.find(), como se ve a continuación:

 

pic6

Dentro de los documentos contenidos en la colección anterior, podemos ver la información de las consultas realizadas con el fin de revisar aquellas cuyos tiempo de ejecución sean demasiado altos…

Espero que tanto esta entrada como la anterior os resultara de interés….

 

Saludos

Unai

Deja un comentario

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