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.
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 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 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 utilizar MongoDB Atlas Performance Advisor (disponible para10 clústeres M o superiores) y MongoDB Compass para determinar, ocultar y eliminar índices innecesarios.
Ocultar índices innecesarios.
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" )
Descartar índices innecesarios.
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:
_idestá indexado por defecto{ course_name: 1 }{ professor: 1 }{ semester: 1 }{ day: 1, time: 1 }