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 }

La creación de índices para cada campo de una colección puede generar colecciones infladas y afectar negativamente el rendimiento de escritura.

1

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_1 se puede descartar porque no se utiliza para ninguna consulta, como lo indica su recuento accesses de 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 quedan los siguientes índices porque son los más utilizados 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