martes, 9 de julio de 2013

Haciendo indices con MongoDB

MongoDB es una base de datos NoSQL muy conocida, es una base documental, sin esquema, lo que guarda es BSON que es un formato muy similar a JSON. En vez de tablas tiene colecciones, vuelvo a repetir; las colecciones no tienen un esquema determinado por ejemplo tenemos la colección friends:

> db.people.find()
{ "_id" : "Mike", "interests" : [  "chess",  "botany" ] }
{ "_id" : "Juan", "interests" : [  "chess",  "Boca Junior", "Linux" ], "facebook": "juanf", gplus:"juanPlus" }
{ "_id" : "Homero", "interests" : [  "beer",  "more beer" ], "facebook": "homeroS" }

Como podemos ver no hay muchos amigos, podrían ser millones o billones o más lo que haría que funcione muy lento. Si buscamos por algún campo, MongoDB hace lo que se conoce como un full scan, revisa todas las colecciones buscando. Es poco eficiente, y aqui es donde aparecen los indices, los indices le permiten encontrar algo a la base, sin recorrer toda la colección; es algo así como el indice de la guía telefónica con el podemos encontrar un número más rápidamente. Como podemos hacer un indice en MongoDB? 

db.collection.ensureIndex(keys. options)

Para nuestro ejemplo sería así:

db.people.ensureIndex({"facebook":1})

Podemos utilizar varios atributos para indexar y en mongoDB podemos indexar arreglos, ya se lo que estas pensando lleno mi base de indixes y todo va andar super rápido. Pero no es así los indices agilizan las consultas pero penalizan las modificaciones e inserciones, tenes que insertar o modificar en la colección y el indice. Por lo tanto no es recomendable generar indices que no se van a usar, no voy a buscar nunca a un amigo por su cuenta de google plus entonces no hago el indice. 

Con el 1 se especifica el orden 1 ascendente y -1 descendente. 

Que pasa cuando no existe siempre el campo? se indexa igual pero vas a tener problemas si el index es único, supongamos:

db.people.ensureIndex({facebook:1}, { unique: true })

Dejo link: