Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Remover índices innecesarios

Crear índices para cada query puede conducir a índices innecesarios, lo que puede degradar el rendimiento de la base de datos. Es posible que los índices innecesarios se utilicen rara vez, sean redundantes debido a la cobertura de otro índice compuesto o no se utilicen en absoluto. Para optimizar el rendimiento de la base de datos, es importante minimizar la cantidad de índices que utilizas. Identifica y remueve los índices innecesarios para mantener una ejecución eficiente de queries y el uso de recursos.

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 informa sobre las métricas de uso del índice en el campo accesos solo para el nodo donde se ejecuta la query. Para obtener estadísticas de uso del índice más completas, ejecuta $indexStats en cada nodo del clúster.

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

[
{
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 usar MongoDB Atlas Performance Advisor (disponible para clústeres M10 o superior) y MongoDB Compass para determinar, ocultar y descartar índices innecesarios.

2

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

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

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

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