[hoMONGOus DB]Índices, profiling en Mongo DB - I

NOTA PRELIMINAR: Antes de nada, noes mi propósito profundizar en las raices de NoSQL y ni siquiera ponerme a explicar posibles escenarios o motivaciones de uso, para eso ya hay mucha información por la web. Por supuesto, tampoco pretendo hacer una introducción a Mongo DB, para eso también tenemos una estupenda web de referencia, www.mongodb.org con una cantidad de información terrible, y en diferentes idiomas para que no exista la excusa del inglés. Además si visitas Amazon también podrás ver información sobre libros de esta base de datos nosql.

Para serle sincero, MongoDB, es una de estas cosas que te sorprenden, y no por el hecho de ser una base de datos NOSQL, puesto que ya tenía experiencias con alguna de ellas. Desde que por temas de trabajo he empezado a trabajar con MongoDB,  hace ya un tiempo largo, su simplicidad y sus “terribles” capacidades y la forma de explotarlas me han parecido maravillosas. Siempre que tenga tiempo, que es casi nunca, intentaré escribir algunas de las cosas curiosas de MongoDb o bien algunos truquillos de interés, lógicamente, puesto que la temática de este blog es .NET trataré de enfocarme en temas que tengan que ver con las API .NET de manejo de MongoDB.

Una de las cosas en las que uno primero piensa, bueno, por lo menos eso fué lo que me pasó a mi, es en como funciona el motor de consultas y las similitudes que esos pudieran tener con un motor relacional. Lógicamente, lo primero es pensar en si existe el concepto de índices y como estos están implementados. Para MongoDB, los índices son prácticamente idénticos, en realidad la filosofía es exáctamente igual,  a los indices que pudiéramos tener en una base de datos relacional, lógicamente con la diferencia de que estos índices se expresan como documentos ( mongodb es una base de datos documental) y aplican sobre documentos. Conceptos como la densidad y la ordenación aplican de igual forma tanto en una base de datos relacional como en esta base documental.

En el momento en el que una base de datos es creada en MongoDb, esta automáticamente dispone de una colección, llamada system.idexes que permite almacenar la información de nuestros índices, en la siguiente figura puede ver como obtener la información de los distintos índices almancenados. Por supuespic1to, esta misma información la podemos obtener desde nuestros programas escritos en C#, no obstante, como iremos viendo código más adelante por ahora dejamos simplemente la información de los pasos seguidos dentro de una shell de mongo.

Como puede observar, en la imagen anterior, cada indice esta formado por un documento con tres claves, el nombre, el namespace y la clave del índice. En el caso de la figura anterior, el índice tiene por nombre “name” y aplica a la colección system.users en su clave “_Id” ( clave por defecto de todos los documentos si no se especifica su BsonId).

Con esto, podremos decir entonces, que las consultas sobre la colección system.users que utilicen un filtro u ordenación por “_id” utilizarán el índice adecuado. Para demostrarlo, realizaremos los siguientes pasos en nuestra shell.

pic2

En la consulta anterior, ni se filtra ni se ordena por nuestra clave de índice, por lo tanto, al igual que en cualquier base de datos relacional se realiza un table scan. Para verlo, podríamos utilizar un comando llamado explain, gracias al cual podríamos obtener un documento con la información del plan seguido, en el cual podremos ver desde el tiempo de ejecución hasta el cursor utilizado y el número de elementos escaneados.

 

Si variamos un poco la consulta, por ejemplo ordenando por la clave _id del documento y volvemos a mostrar la información del método explain, veremos como en este caso la cosa cambia.

 

pic3 Fíjese, en la imagen anterior, como ahora nuestra consulta utiliza un cursor BtreeCursor  en la clave _id y por lo tanto esta consulta, dependiendo de la densidad, podrá realizarse de una forma mucho más optima.

 

 

 

 

 

 

Crear nuevos indices, a mayores de los indices creados por defecto en cualquier colección sobre el elemento _id, es realmente sencillo, desde código podríamos usar algo como lo mostrado a continuación:

 

 
           //connect to server
            string mongoConnectionString = "mongodb://localhost";
            MongoServer server = MongoServer.Create(new MongoUrl(mongoConnectionString));

            //recover database and collection references
            var database = server.GetDatabase("dbsample");
            var customers = database.GetCollection("customers");

            //ensure index
            customers.EnsureIndex(IndexKeys.Ascending("FirstName").Descending("Age"), IndexOptions.SetUnique(false));

En este ejemplo de código, se establece un nuevo índice sobre las claves FirstName, de forma ascendente, y Age de forma descendente, a mayores, por supuesto, se establece una opción de no único. El mismo ejemplo desde la shell podría haberse escrito como db.Customers.ensureIndex({“FirstName”:1,”Age”:-1}).

Si una vez hecho esto, realizaramos por ejemplo la una consulta sobre el nombre de un cliente podríamos revisar la utilización o no del índice:

 

pic4

 

NOTA: Para aquellos que no os guste trabajar con una shell, os recomiendo probar el GUI MongoVue, tengo que agradecer desde aquí a Sergio Jimenez el conocimiento de su existencia.

 

En la siguiente entrada continuaremos viendo más sobre indices, explain de consultas, hint y algo de profiling…

 

Saludos

Unai

Published 13/1/2011 20:01 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2011/01/13/homongous-db-205-ndices-profiling-en-mongo-db-i.aspx

Comentarios

# [hoMONGOus DB]Índices, profiling en Mongo DB - II

En la anterior entrada sobre MongoDb e índices, empezamos por explicar las principales características

Thursday, January 13, 2011 11:02 PM por O bruxo mobile