Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Remover índices desnecessários

Nesta página

  • Sobre esta tarefa
  • Passos
  • Avalie o uso do índice
  • Hide Indexes
  • Índice de descarte
  • Saiba mais

Criar índices para cada query pode levar a índices desnecessários, o que pode degradar o desempenho do banco de dados de dados. Índices desnecessários podem ser raramente usados, redundantes devido à cobertura de outro índice composto ou não ser usados. Para otimizar o desempenho do banco de dados de dados, é importante minimizar o número de índices utilizados. Identifique e remova índices desnecessários para manter a execução eficiente de queries e o uso de recursos.

Considere a seguinte coleção courses , onde cada documento armazena informações sobre um curso colegial 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"
}
)

A coleção courses tem um índice para cada campo:

  • _id é indexado por padrão

  • { course_name: 1 }

  • { professor: 1 }

  • { semester: 1 }

  • { building: 1 }

  • { days: 1 }

  • { time: 1 }

  • { day: 1, time: 1 }

A criação de índices para cada campo em uma collection pode levar a collections inchadas e impacto negativamente o desempenho de gravação.

1

Para determinar quais índices são raramente usados, use o estágio de agregação $indexStats :

db.courses.aggregate( [ { $indexStats: { } } ] )

A operação retorna o seguinte:

[
{
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" }
},
...
]
  • O índice building_1 pode ser descartado porque não é usado para nenhuma query, conforme indicado por sua contagem accesses de zero.

  • Os índices { days: 1 } e { time: 1 } podem ser eliminados porque o índice composto { day: 1, time: 1 } cobre consultas relacionadas a tempo.

Você também pode usaro MongoDB Atlas Performance Advisor (disponível para clusters M10 ou superior) e o MongoDB Compass para determinar, ocultar e eliminar índices desnecessários.

2

Depois de identificar os índices desnecessários, você pode usar o método db.collection.hideIndex() para ocultar os índices e avaliar seu impacto no banco de banco de dados antes de removê-los.

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

Se você determinar que os índices são desnecessários e têm um impacto negativo no desempenho, elimine os índices usando o método db.collection.dropIndexes() .

db.courses.dropIndexes( [ "days_1", "time_1", "building_1" ] )

Neste exemplo, somente os seguintes índices permanecem por serem os usados com mais frequência e ajudam a otimizar as queries:

  • _id é indexado por padrão

  • { course_name: 1 }

  • { professor: 1 }

  • { semester: 1 }

  • { day: 1, time: 1 }

Voltar

Reduza o número de collections