Usar Índices de MongoDB

MongoDBMongoDBBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá los fundamentos de cómo utilizar los índices de MongoDB para optimizar el rendimiento de consultas y operaciones de clasificación. El laboratorio cubre varios pasos clave, incluyendo la consulta con índices, la clasificación utilizando índices, la verificación de la cobertura de índices, el manejo de índices faltantes y la eliminación de índices no utilizados. Al final del laboratorio, tendrá una comprensión sólida de cómo aprovechar las capacidades de indexación de MongoDB para mejorar la eficiencia de sus aplicaciones de base de datos.

El laboratorio comienza creando una colección de muestra y demostrando cómo crear un índice en un campo específico para acelerar las consultas. Luego explora el uso de índices para operaciones de clasificación y la verificación de la cobertura de índices para una consulta dada. El laboratorio también aborda los casos en los que falta un índice y cómo manejar dichos casos, así como el proceso de eliminación de índices no utilizados para mantener una base de datos saludable.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/IndexingGroup(["Indexing"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/BasicOperationsGroup -.-> mongodb/delete_document("Delete Document") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/sort_documents("Sort Documents") mongodb/IndexingGroup -.-> mongodb/create_index("Create Index") mongodb/IndexingGroup -.-> mongodb/build_compound_index("Build Compound Index") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/update_document -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/delete_document -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/find_documents -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/query_with_conditions -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/sort_documents -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/create_index -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/build_compound_index -.-> lab-422098{{"Usar Índices de MongoDB"}} mongodb/aggregate_group_totals -.-> lab-422098{{"Usar Índices de MongoDB"}} end

Consulta con Índice

En este paso, aprenderá a utilizar índices para optimizar el rendimiento de consultas en MongoDB. Los índices son estructuras de datos especiales que almacenan una pequeña parte del conjunto de datos de una colección en una forma fácil de recorrer, lo que hace que las consultas a la base de datos sean mucho más rápidas.

Primero, comencemos abriendo la shell de MongoDB:

mongosh

Ahora, creemos una colección de muestra con algunos datos para demostrar la indexación:

use indexlab

db.users.insertMany([
    { name: "Alice", age: 28, city: "New York" },
    { name: "Bob", age: 35, city: "San Francisco" },
    { name: "Charlie", age: 42, city: "Chicago" },
    { name: "David", age: 25, city: "New York" },
    { name: "Eve", age: 31, city: "San Francisco" }
])

Creamos un índice en el campo 'age' para acelerar las consultas:

db.users.createIndex({ age: 1 });

El 1 indica un índice ascendente. Ahora, ejecutemos una consulta y comprobemos su rendimiento:

db.users.find({ age: { $gt: 30 } }).explain("executionStats");

Este comando mostrará los detalles de ejecución de la consulta, incluyendo si se utilizó el índice.

Salida de ejemplo:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "age_1"
      }
    }
  },
  "executionStats": {
    "executionTimeMillis": 0,
    "totalDocsExamined": 2,
    "totalKeysExamined": 2
  }
}

Las cosas importantes a destacar son:

  • IXSCAN indica que se utilizó el índice
  • totalDocsExamined es bajo, lo que muestra que el índice ayudó a optimizar la consulta
  • executionTimeMillis es muy corto

Ordenar utilizando Índice

En este paso, aprenderá a utilizar índices para optimizar las operaciones de clasificación en MongoDB. La clasificación de grandes conjuntos de datos puede ser computacionalmente costosa, pero con el índice adecuado, podemos mejorar significativamente el rendimiento.

Continuemos trabajando con nuestra base de datos existente del paso anterior:

use indexlab

Crearemos un índice compuesto que permita una clasificación eficiente:

db.users.createIndex({ city: 1, age: -1 });

Este índice compuesto nos ayudará a ordenar por ciudad en orden ascendente y por edad en orden descendente. Ejecutemos una consulta que demuestre esto:

db.users.find().sort({ city: 1, age: -1 }).explain("executionStats");

Salida de ejemplo:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "SORT",
      "sortPattern": { "city": 1, "age": -1 },
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "city_1_age_-1"
      }
    }
  },
  "executionStats": {
    "executionTimeMillis": 0,
    "totalDocsExamined": 5,
    "totalKeysExamined": 5
  }
}

Ahora, veamos los resultados reales ordenados:

db.users.find().sort({ city: 1, age: -1 });

Observaciones clave:

  • El índice admite la clasificación por múltiples campos
  • 1 significa orden ascendente
  • -1 significa orden descendente
  • La consulta utiliza el índice para una clasificación eficiente

Verificar la cobertura de índices

En este paso, aprenderá a verificar la cobertura de índices y a comprender cómo MongoDB utiliza índices para optimizar el rendimiento de consultas. La cobertura de índices le ayuda a determinar si sus consultas están utilizando por completo los índices disponibles.

Continuemos trabajando con nuestra base de datos existente:

use indexlab

Crearemos un índice más completo para demostrar la cobertura:

db.users.createIndex({ name: 1, city: 1, age: 1 });

Ahora, ejecutemos una consulta que puede utilizar por completo nuestro índice:

db.users.find({ name: "Alice", city: "New York" }).explain("executionStats");

Salida de ejemplo:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "name_1_city_1_age_1"
      }
    }
  },
  "executionStats": {
    "totalDocsExamined": 1,
    "totalKeysExamined": 1,
    "indexesUsed": ["name_1_city_1_age_1"]
  }
}

Verifiquemos una consulta con cobertura parcial de índices:

db.users.find({ city: "New York" }).explain("executionStats");

Observaciones clave:

  • totalDocsExamined muestra cuántos documentos se verificaron
  • totalKeysExamined indica la eficiencia del índice
  • indexesUsed muestra qué índices se utilizaron

Para listar todos los índices en la colección:

db.users.getIndexes();

Manejar Índices Faltantes

En este paso, aprenderá a manejar consultas sin índices y a comprender las implicaciones de rendimiento de los índices faltantes en MongoDB.

Continuemos trabajando con nuestra base de datos existente:

use indexlab

Primero, ejecutemos una consulta sin índice para ver su rendimiento:

db.users.find({ email: "[email protected]" }).explain("executionStats");

Salida de ejemplo:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "COLLSCAN",
      "direction": "forward"
    }
  },
  "executionStats": {
    "totalDocsExamined": 5,
    "executionTimeMillis": 0
  }
}

Observaciones clave:

  • COLLSCAN indica una búsqueda en la colección (verificación de cada documento)
  • totalDocsExamined muestra que se verificaron todos los documentos

Creamos un índice para mejorar el rendimiento de esta consulta:

db.users.createIndex({ email: 1 });

Ahora, ejecute nuevamente la misma consulta:

db.users.find({ email: "[email protected]" }).explain("executionStats");

Salida de ejemplo:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "email_1"
      }
    }
  },
  "executionStats": {
    "totalDocsExamined": 0,
    "totalKeysExamined": 0,
    "executionTimeMillis": 0
  }
}

Mejoras clave:

  • IXSCAN reemplaza COLLSCAN
  • totalDocsExamined es ahora 0
  • El rendimiento de la consulta se ha mejorado significativamente

Para agregar el correo electrónico a nuestros usuarios existentes:

db.users.updateMany({}, [
  {
    $set: {
      email: {
        $concat: [{ $toLower: "$name" }, "@example.com"]
      }
    }
  }
]);

Eliminar Índices No Utilizados

En este paso, aprenderá a identificar y eliminar índices no utilizados en MongoDB para optimizar el rendimiento y el almacenamiento de la base de datos.

Comencemos viendo todos los índices existentes en nuestra colección:

use indexlab
db.users.getIndexes()

Salida de ejemplo:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { city: 1, age: -1 }, name: 'city_1_age_-1' },
  { v: 2, key: { name: 1, city: 1, age: 1 }, name: 'name_1_city_1_age_1' },
  { v: 2, key: { email: 1 }, name: 'email_1' }
]

Para comprobar el uso de los índices, utilizaremos la agregación $indexStats:

db.users.aggregate([{ $indexStats: {} }]);

Salida de ejemplo:

[
  {
    name: 'age_1',
    key: { age: 1 },
    host: '...',
    accesses: {
      ops: 0,
      since: ISODate("...")
    }
  },
  //... otras estadísticas de índices
]

Vamos a eliminar un índice no utilizado. Eliminaremos el índice 'city1_age-1':

db.users.dropIndex("city_1_age_-1");

Verifique que el índice se haya eliminado:

db.users.getIndexes();

Mejores prácticas para la gestión de índices:

  • Compruebe regularmente el uso de los índices
  • Elimine los índices que no se utilizan con frecuencia
  • Tenga en cuenta el equilibrio entre el rendimiento de las consultas y la sobrecarga de almacenamiento

Resumen

En este laboratorio, aprendió a utilizar los índices de MongoDB para optimizar el rendimiento de consultas y operaciones de clasificación. Primero, creó un índice en el campo 'age' y observó cómo se utilizó el índice para acelerar las consultas que filtran por el campo 'age'. Luego, creó un índice compuesto para habilitar una clasificación eficiente en múltiples campos. También aprendió a verificar la cobertura de índices y manejar índices faltantes, así como a eliminar índices no utilizados para mantener una estructura de índices saludable.