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

Comprender los índices de MongoDB

Entre las tareas involucradas en la gestión de bases de datos está mejorar el rendimiento mediante el empleo de diferentes estrategias. La indexación es uno de los consejos que mejoran las operaciones de rendimiento al facilitar el acceso a los datos para las solicitudes de consulta. Lo hace minimizando la cantidad de acceso al disco requerido cuando se procesa una consulta. Si no se usan índices en MongoDB, la base de datos se verá obligada a realizar un escaneo completo de la colección, es decir, escanear todos los documentos de la colección para seleccionar documentos que coincidan con una declaración de consulta emitida. Obviamente, esto llevará mucho tiempo, especialmente si hay tantos documentos involucrados. En pocas palabras, los índices admiten la ejecución eficiente de consultas.

Índices de MongoDB

Dado que esperamos almacenar muchos documentos en una colección de MongoDB, necesitamos encontrar una manera de almacenar una pequeña porción de datos para cada documento en una partición diferente para facilitar el recorrido mediante el uso de índices. Un índice almacenará un valor de campo o campos específicos y luego ordenará estos datos según el valor de ese campo. Con este ordenamiento, se admiten operaciones de consulta basadas en rango y coincidencia de consultas eficientes. Los índices se definen a nivel de colección y son compatibles con cualquier campo o campo incrustado de los documentos de la colección.

Cuando crea un documento, MongoDB asigna de forma predeterminada un campo _id si no se especifica y lo convierte en un índice único para ese documento. Básicamente, esto es para evitar la inserción del mismo documento más de uno en esa colección. Además, para un clúster fragmentado, se recomienda utilizar este campo _id como parte de la selección de claves fragmentadas; de lo contrario, debe haber cierta exclusividad de los datos en el campo _id para evitar errores.

Crear un índice para una colección

Suponiendo que ha insertado algunos datos en su colección y desea asignar un campo para que sea un índice, puede usar el método createIndex para lograrlo, es decir,

Digamos que tiene estos datos json:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Podemos hacer que el campo Nombre sea un índice descendente por:

db.collection.createIndex({Name: -1})

Este método crea un índice con la misma especificación, si es que aún no existe.

Tipos de Índices en MongoDB

MongoDB involucra diferentes tipos de datos, por lo tanto, se derivan diferentes tipos de índices para admitir estos tipos de datos y consultas.

  1. Campo único

    Usando un solo campo de un documento, uno puede hacer que el campo sea un índice de manera ascendente o descendente, como en el ejemplo anterior. Además, puede crear un índice en un documento incrustado como un todo, por ejemplo:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    El campo de contacto es un documento incrustado, por lo que podemos convertirlo en un índice ascendente con el comando:

    db.collection.createIndex({ Contact: 1})

    En una consulta podemos buscar el documento como:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Una mejor práctica es crear el índice en segundo plano, especialmente cuando se trata de una gran cantidad de datos, ya que la aplicación necesita acceder a los datos mientras crea el índice.

  2. Índice compuesto

    Los índices compuestos a menudo se usan para facilitar la operación de clasificación dentro de una consulta y admiten consultas que coinciden en varios campos. La sintaxis para crear un índice compuesto es:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Creando un índice compuesto para los datos de muestra a continuación

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Consideraciones:

    • Se admite un límite de solo 32 campos.
    • El valor del campo definirá el tipo de índice, es decir, 1 es ascendente y -1 es descendente.
    • No cree índices compuestos que tengan un tipo de índice hash.
    • El orden de los campos enumerados en un índice compuesto es importante. La clasificación se realizará de acuerdo con el orden de los campos.
  3. Índice multiclave

    En algún momento, puede tener campos con contenido de matriz almacenado. Cuando se indexan estos campos, se crean entradas de índice separadas para cada elemento. Por lo tanto, ayuda a una consulta a seleccionar documentos que consisten en matrices haciendo coincidir el elemento o los elementos de las matrices. MongoDB lo hace automáticamente, por lo que no es necesario especificar explícitamente el tipo de clave múltiple. A partir de la versión 3.4, MongoDB rastrea qué campos indexados hacen que un índice sea un índice de múltiples claves. Con este seguimiento, el motor de consulta de la base de datos puede usar límites de índice más estrictos.

    Limitaciones del índice de teclas múltiples

    • Solo se puede usar un campo de matriz en la indexación de claves múltiples para un documento en la colección. Es decir. No puede crear un índice multiclave para el comando y los datos a continuación
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      No puede crear un índice multiclave
      { nums: 1, scores: 1 } 
    • Si el índice multiclave ya existe, no puede insertar un documento que viole esta restricción. Es decir si tenemos
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Después de crear un índice multiclave compuesto, un intento de insertar un documento donde los campos de números y puntajes son matrices, la base de datos fallará en la inserción.
  4. Índices de texto

    Los índices de texto a menudo se usan para mejorar las consultas de búsqueda de una cadena en una colección. No almacenan palabras vacías específicas del idioma (es decir, "el", "a", "o"). Una colección puede tener como máximo un índice de texto. Para crear un índice de texto:

    db.collection.createIndex({Name:”text”})

    También puede indexar varios campos, es decir,

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Un índice compuesto puede incluir una clave de índice de texto en combinación con la clave de índice ascendente/descendente pero:

    • Todas las claves del índice de texto deben estar adyacentes en el documento de especificación del índice al crear un índice de texto compuesto.
    • Ningún otro tipo de índice especial, como los campos de índice de claves múltiples, debe estar involucrado en el índice de texto compuesto.
    • Para realizar una búsqueda de $texto, el predicado de consulta debe incluir condiciones de coincidencia de igualdad en las claves anteriores.
  5. Índices hash

    Sharding es una de las técnicas utilizadas en MongoDB para mejorar el escalado horizontal. La fragmentación a menudo implica un concepto basado en hash mediante el uso de índices hash. Estos índices representan la distribución más aleatoria de valores a lo largo de su rango, pero solo admiten coincidencias de igualdad y no admiten consultas basadas en rango.

Consideraciones operativas generales para índices

  • Cada índice requiere al menos 8kB de espacio de datos.
  • Cuando está activo, cada índice consumirá algo de espacio en disco y memoria. Esto es importante cuando se realiza un seguimiento en la planificación de la capacidad.
  • Para una recopilación con una proporción alta de lectura y escritura, los índices adicionales mejoran el rendimiento y no afectan las operaciones de lectura no indexadas.

Limitaciones del uso de índices

  • Agregar un índice tiene un impacto negativo en el rendimiento de las operaciones de escritura, especialmente para las colecciones con una proporción alta de lectura y escritura. Los índices serán costosos porque cada inserción también debe actualizar cualquier índice.
  • MongoDB no creará, actualizará un índice ni insertará en una colección indexada si la entrada de índice para un documento existente excede el límite de clave de índice.
  • Para las colecciones fragmentadas existentes, la migración de fragmentos fallará si el fragmento tiene un documento que contiene un campo indexado que tiene una entrada de índice que excede el límite de clave de índice.

Conclusión

Hay tantas formas de mejorar el rendimiento de MongoDB, siendo la indexación una de ellas. La indexación facilita las operaciones de consulta al reducir la latencia sobre la cual se recuperan los datos al minimizar de alguna manera la cantidad de documentos que deben escanearse. Sin embargo, hay algunas consideraciones que uno debe realizar antes de decidir utilizar un tipo específico de índice. Las colecciones con una proporción alta de lectura y escritura tienden a utilizar los índices mejor que las colecciones con un alto número de operaciones de escritura y lectura.