Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Remover índices innecesarios

Crear índices para cada consulta puede generar índices innecesarios, lo que puede reducir el rendimiento de la base de datos. Estos índices innecesarios podrían usarse con poca frecuencia, ser redundantes debido a la cobertura de otro índice compuesto o incluso no usarse. Para optimizar el rendimiento de la base de datos, es importante minimizar el número de índices utilizados. Identifique y elimine los índices innecesarios para mantener una ejecución de consultas y un uso de recursos eficientes.

Considere lo siguiente courses colección, donde cada documento almacena información sobre un curso escolar diferente.

// Biology course document
db.courses.insertOne(
{
_id: 1,
course_name: "Biology 101",
professor: "Tate",
semester: "Fall",
days: "Monday, Friday",
time: "12:00",
building: "Olson"
}
)

La colección courses tiene un índice para cada campo:

  • _id está indexado por defecto

  • { course_name: 1 }

  • { professor: 1 }

  • { semester: 1 }

  • { building: 1 }

  • { days: 1 }

  • { time: 1 }

  • { day: 1, time: 1 }

Crear índices para cada campo de una colección puede dar lugar a colecciones infladas y tener un impacto negativo en el rendimiento de escritura.

1

Para determinar qué índices se usan raramente, utiliza el $indexStats etapa de agregación:

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

Advertencia

$indexStats reporta las métricas de uso del índice en el campo de accesos solo para el nodo donde se ejecuta la consulta. Para obtener estadísticas de uso del índice más completas, ejecute $indexStats en cada nodo del clúster.

La salida incluye el campo de accesos, que informa la cantidad de veces que los usuarios han utilizado cada índice para ejecutar una operación en el M-C02FJ3BDML85:27017 nodo:

[
{
name: "building_1",
key: { "building": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('0')", "since": "ISODate('2024-06-24T17:35:00.000Z')" },
spec: { "v": 2, "key": { "building": 1 }, "name": "building_1" }
},
{
name: "day_1",
key: { "day": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('1')", "since": "ISODate('2024-06-24T17:35:30.000Z')" },
spec: { "v": 2, "key": { "day": 1 }, "name": "day_1" }
},
{
name: "time_1",
key: { "time": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('1')", "since": "ISODate('2024-06-24T17:36:00.000Z')" },
spec: { "v": 2, "key": { "time": 1 }, "name": "time_1" }
},
{
name: "day_1_time_1",
key: { "day": 1, "time": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('110')", "since": "ISODate('2024-06-24T17:31:21.800Z')" },
spec: { "v": 2, "key": { "day": 1, "time": 1 }, "name": "day_1_time_1" }
},
{
name: "_id_",
key: { "_id": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('150')", "since": "ISODate('2024-06-24T15:31:49.463Z')" },
spec: { "v": 2, "key": { "_id": 1 }, "name": "_id_" }
},
{
name: "course_name_1",
key: { "course_name": 1 },
host: "M-C02FJ3BDML85:27017",
accesses: { "ops": "Long('120')", "since": "ISODate('2024-06-24T17:29:26.344Z')" },
spec: { "v": 2, "key": { "course_name": 1 }, "name": "course_name_1" }
},
...
]
  • El building_1 índice puede descartarse porque no se utiliza para ninguna queries, como lo indica su recuento de accesses igual a cero.

  • Se pueden descartar los índices { days: 1 } y { time: 1 } ya que el índice compuesto { day: 1, time: 1 } cubre las consultas relacionadas con el tiempo.

También puedes utilizar MongoDB Atlas Performance Advisor (disponible para10 clústeres M o superiores) y MongoDB Compass para determinar, ocultar y eliminar índices innecesarios.

2

Después de identificar los índices innecesarios, puede utilizar el db.collection.hideIndex() método para ocultarlos y evaluar su impacto en la base de datos antes de eliminarlos.

db.courses.hideIndex( "days_1" )
db.courses.hideIndex( "time_1" )
db.courses.hideIndex( "building_1" )
3

Si determina que los índices son innecesarios y tienen un impacto negativo en el rendimiento, elimínelos utilizando el db.collection.dropIndexes() método.

db.courses.dropIndexes( [ "days_1", "time_1", "building_1" ] )

En este ejemplo, solo permanecen los siguientes índices porque son los más utilizados con frecuencia y ayudan a optimizar las consultas:

  • _id está indexado por defecto

  • { course_name: 1 }

  • { professor: 1 }

  • { semester: 1 }

  • { day: 1, time: 1 }

Volver

Reducir la cantidad de colecciones

Obtén una insignia de habilidad

Domine "Patrones y antipatrones avanzados de esquemas" de forma gratuita.

Más información

En esta página