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.
Acerca de esta tarea
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:
_idestá 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.
Pasos
Evalúa el uso del índice.
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 deaccessesigual 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.
Ocultar índices innecesarios.
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" )
Descartar índices innecesarios.
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:
_idestá indexado por defecto{ course_name: 1 }{ professor: 1 }{ semester: 1 }{ day: 1, time: 1 }