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 }
La creación de índices para cada campo de una colección puede generar colecciones infladas y afectar negativamente el rendimiento de escritura.
Pasos
Evaluar el uso del índice
Para determinar qué índices rara vez se utilizan, utilice el $indexStats
etapa de agregación:
db.courses.aggregate( [ { $indexStats: { } } ] )
La operación devuelve lo siguiente:
[ { 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 índice
building_1se puede descartar porque no se utiliza para ninguna consulta, como lo indica su recuentoaccessesde 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.
Hide Indexes
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
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 quedan los siguientes índices porque son los más utilizados y ayudan a optimizar las consultas:
_idestá indexado por defecto{ course_name: 1 }{ professor: 1 }{ semester: 1 }{ day: 1, time: 1 }