¿Qué es un índice?
Un índice en bases de datos es una estructura de datos que toma los valores de campos particulares de una tabla (los ID por defecto) y se almacena en un espacio de rápido acceso, esto con la intención de que al hacer un query cuyo campo de filtrado este indexado, el registro es localizado a partir del indice y la velocidad de respuesta del proceso sea mucho más rápido, tal cómo el índice de un libro.
En el caso particular de MongoDB, al no buscar por un campo indexado el proceso de mongod debe recorrer todo el documento de los registros de una colección para hacer realizar la búsqueda, este proceso es ineficiente y requiere un alto numero de recursos para manipular todo el volumen de información.
Una mala práctica que utilizan algunos es indexar la mayor cantidad de campos que puedan lo cual termina casi duplicando en volumen la base de datos y el proceso que busca en los índices se torna igual de lento que buscar normalmente ya que los índices son almacenados en memoria y al agotarse el espacio reservado, el almacenamiento de índices empieza a escribirse en disco, el cual es de acceso mucho mas lento. Es por esto que debemos resaltar y aconsejar que sólo debes crear índices sobre campos que vayan a ser consultados con alta frecuencia.
Tipos de índice
Hablemos un poco sobre los diferentes tipos de índice que podemos implementar en MongoDB:
- Índice _id – el identificador principal de un registro es el índice por defecto, si no especificas uno al crear un documento el proceso de *mongod* le asignará uno automaticamente de tipo ObjectID.
- Índice sencillo – definidos sobre un único campo de un documento.
- Índice compuesto – definidos sobre varios campos de un documento, será tomado como un índice único por parte de MongoDB.
- Índice mutillave – utilizado en casos de que el campo a indexar pertenezca a subdocumentos dentro de un arreglo del documento padre.
- Índice geoespacial – utilizado para indexar campos que sean coordenadas de tipo GeoJSON.
- Índice texto – al momento de escritura se encuentra fase beta y se utiliza para buscar contenidos de cadenas de caracteres en los documentos.
- Índice tipo hash – utilizado en la estrategia de llaves de fragmento hasheadas que se lleva a cabo en los procesos de fragmentación de datos.
En este curso no tocaremos los últimas 3.
Propiedades
Existen un par de propiedades interesantes de los índices que puedes aprovechar:
- Unicidad – esta propiedad permite establecer el índice como campo único, es decir, al declarar un índice como
unique
sobre un campo particular evitará que existan documentos diferentes con el mismo valor para dicho campo ya que al tratar de insertar un documento bajo estas circunstancias resultará en un error de llave duplicada. Esto resulta muy útil para campos que sirven de identificadores externos que suelen necesitar indexación.
Si tratas de insertar un documento que no tenga valor en este campo, automáticamente se le asignará el valor
null
al valor del indice para este registro. Si tratas nuevamente de hacer lo mismo ocurrirá un error de llave duplicada ya que el índice de valornull
para dicho campo ya existe.
- Dispersión – esta propiedad permite establecer el filtrado de los resultados basado en el campo indexado. Lo entenderás mejor cuando lo apliquemos más adelante.
Preparación
Bien, ahora que sabemos la teoría es hora de poner manos a la obra. Tomemos una situación de ejemplo para manejar el caso.
La semana pasada jugamos unas 15 rondas de poker, creamos una colección puntuaciones y anotamos las siguientes puntuaciones finales:
{ nombre: 'Ricardo', ganadas: 3, perdidas: 3, retiradas: 9, dinero: 15, mejores: ['1 trío', '2 pares'], comentarios:[ { hora: '22:10:10', texto: 'Hoy será mi día de suerte' },{ hora: '23:50:32', texto: 'Quizás otro día' } ] } { nombre: 'Ramses', ganadas: 8, perdidas: 4, retiradas: 3, dinero: 120, mejores: ['Escalera real', 'Full house'], comentarios:[ { hora: '22:12:56', texto: 'Los humillaré a todos' },{ hora: '23:55:59', texto: 'Gracias por darme su dinero' } ] } { nombre: 'Oscar', ganadas: 4, perdidas: 6, retiradas: 5, dinero: 30, mejores: ['Full house', '1 trío'], comentarios:[ { hora: '22:09:12', texto: '¿En realidad vamos a jugar nada mas para mostrar un ejemplo de Mongo?' },{ hora: '23:59:59', texto: 'ZZZZZZzzzzzzz' } ] }