sql >> Base de Datos >  >> NoSQL >> MongoDB

Una descripción general de la indexación de bases de datos para MongoDB

¿Qué es la indexación?

La indexación es un concepto importante en el mundo de las bases de datos. La principal ventaja de crear un índice en cualquier campo es un acceso más rápido a los datos. Optimiza el proceso de búsqueda y acceso a la base de datos. Considere este ejemplo para entender esto.

Cuando cualquier usuario solicita una fila específica de la base de datos, ¿qué hará el sistema de base de datos? Comenzará desde la primera fila y verificará si esta es la fila que el usuario desea. En caso afirmativo, devuelva esa fila; de lo contrario, continúe buscando la fila hasta el final.

Generalmente, cuando define un índice en un campo en particular, el sistema de base de datos creará una lista ordenada del valor de ese campo y la almacenará en una tabla diferente. Cada entrada de esta tabla apuntará a los valores correspondientes en la tabla original. Entonces, cuando el usuario intente buscar cualquier fila, primero buscará el valor en la tabla de índice utilizando el algoritmo de búsqueda binaria y devolverá el valor correspondiente de la tabla original. Este proceso tomará menos tiempo porque estamos usando la búsqueda binaria en lugar de la búsqueda lineal.

En este artículo, nos centraremos en la indexación de MongoDB y comprenderemos cómo crear y usar índices en MongoDB.

¿Cómo crear un índice en la colección MongoDB?

Para crear un índice usando el shell de Mongo, puede usar esta sintaxis:

db.collection.createIndex( <key and index type specification>, <options> )

Ejemplo:

Para crear un índice en el campo de nombre en la colección myColl:

db.myColl.createIndex( { name: -1 } )

Tipos de índices MongoDB

  1. Índice _id predeterminado

    Este es el índice predeterminado que MongoDB creará cuando cree una nueva colección. Si no especifica ningún valor para este campo, entonces _id será la clave principal de forma predeterminada para su colección para que un usuario no pueda insertar dos documentos con los mismos valores de campo _id. No puede eliminar este índice del campo _id.

  2. Índice de campo único

    Puede usar este tipo de índice cuando desee crear un nuevo índice en cualquier campo que no sea el campo _id.

    Ejemplo:

    db.myColl.createIndex( { name: 1 } )

    Esto creará un índice ascendente de clave única en el campo de nombre en la colección myColl

  3. Índice compuesto

    También puede crear un índice en varios campos utilizando índices compuestos. Para este índice, importa el orden de los campos en los que se definen en el índice. Considere este ejemplo:

    db.myColl.createIndex({ name: 1, score: -1 })

    Este índice ordenará primero la colección por nombre en orden ascendente y luego, para cada valor de nombre, ordenará por valores de puntuación en orden descendente.

  4. Índice multiclave

    Este índice se puede utilizar para indexar datos de matriz. Si algún campo en una colección tiene una matriz como su valor, puede usar este índice que creará entradas de índice separadas para cada elemento de la matriz. Si el campo indexado es una matriz, entonces MongoDB creará automáticamente un índice Multikey en él.

    Considere este ejemplo:

    {
    ‘userid’: 1,
    ‘name’: ‘mongo’,
    ‘addr’: [
        {zip: 12345, ...},
    {zip: 34567, ...}
    ]
    }

    Puede crear un índice Multikey en el campo addr emitiendo este comando en el shell de Mongo.

    db.myColl.createIndex({ addr.zip: 1 })
  5. Índice geoespacial

    Supongamos que ha almacenado algunas coordenadas en la colección MongoDB. Para crear un índice en este tipo de campos (que tiene datos geoespaciales), puede usar un índice geoespacial. MongoDB admite dos tipos de índices geoespaciales.

    • Índice 2d:puede usar este índice para datos que se almacenan como puntos en un plano 2D.

      db.collection.createIndex( { <location field> : "2d" } )
    • Índice 2dsphere:use este índice cuando sus datos se almacenen en formato GeoJson o pares de coordenadas (longitud, latitud)

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Índice de texto

    Para admitir consultas que incluyen la búsqueda de algún texto en la colección, puede usar el índice de texto.

    Ejemplo:

    db.myColl.createIndex( { address: "text" } )
  7. Índice hash

    MongoDB admite la fragmentación basada en hash. El índice hash calcula el hash de los valores del campo indexado. El índice hash admite la fragmentación mediante claves fragmentadas hash. La fragmentación hash utiliza este índice como clave de partición para particionar los datos en su clúster.

    Ejemplo:

    db.myColl.createIndex( { _id: "hashed" } )
Propiedades del índice
  1. Índice único

    Esta propiedad garantiza que no haya valores duplicados en el campo indexado. Si se encuentran duplicados al crear el índice, descartará esas entradas.

  2. Índice disperso

    Esta propiedad asegura que todas las consultas busquen documentos con campo indexado. Si algún documento no tiene un campo indexado, se descartará del conjunto de resultados.

  3. Índice TTL

    Este índice se utiliza para eliminar automáticamente documentos de una colección después de un intervalo de tiempo específico (TTL). Esto es ideal para eliminar documentos de registros de eventos o sesiones de usuario.

Análisis de rendimiento

Considere una colección de puntajes de estudiantes. Tiene exactamente 3000000 documentos en el mismo. No hemos creado ningún índice en esta colección. Vea esta imagen a continuación para comprender el esquema.

Documentos de muestra en la colección de partituras

Ahora, considere esta consulta sin ningún índice:

db.scores.find({ student: 585534 }).explain("executionStats")

Esta consulta tarda 1155 ms en ejecutarse. Aquí está la salida. Busque el campo de tiempo de ejecuciónMillis para obtener el resultado.

Tiempo de ejecución sin indexación

Ahora vamos a crear un índice en el campo del estudiante. Para crear el índice, ejecute esta consulta.

db.scores.createIndex({ student: 1 })

Ahora la misma consulta tarda 0ms.

Tiempo de ejecución con indexación

Puede ver claramente la diferencia en el tiempo de ejecución. Es casi instantáneo. Ese es el poder de la indexación.

Conclusión

Una conclusión obvia es:crear índices. Según sus consultas, puede definir diferentes tipos de índices en sus colecciones. Si no crea índices, cada consulta escaneará las colecciones completas, lo que lleva mucho tiempo, lo que hace que su aplicación sea muy lenta y utiliza muchos recursos de su servidor. Por otro lado, tampoco cree demasiados índices porque la creación de índices innecesarios provocará una sobrecarga de tiempo adicional para todas las inserciones, eliminaciones y actualizaciones. Cuando realiza cualquiera de estas operaciones en un campo indexado, también debe realizar la misma operación en el árbol de índice, lo que lleva tiempo. Los índices se almacenan en la RAM, por lo que la creación de índices irrelevantes puede consumir su espacio de RAM y ralentizar su servidor.