Remover índices desnecessários
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.
Sobre esta tarefa
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.
Passos
Avalie o uso do índice
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 contagemaccesses
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.
Hide Indexes
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" )
Índice de descarte
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 }