Adicionar índices secundários no metaField e timeField
Nesta página
Para melhorar o desempenho da query para coleções de séries temporais, adicione um ou mais índices secundários para ter compatibilidade com padrões comuns de query de séries temporais. Especificamente, recomendamos que você crie um ou mais índices compostos nos campos especificados como timeField
e metaField
. Se o valor do campo metaField
for um documento, você poderá criar índices secundários em campos dentro desse documento.
Observação
Nem todos os tipos de índice são suportados. Para obter uma lista de tipos de índice sem suporte, consulte Limitações para índices secundários em coleções de séries temporais.
Por exemplo, este comando cria um índice composto nos campos metadata.sensorId
e timestamp
:
db.weather24h.createIndex({ "metadata.sensorId": 1, "timestamp": 1 })
Use índices secundários para melhorar o desempenho de classificação
As operações de classificação no timeField
e metaField
podem utilizar índices secundários nestes campos para melhorar o desempenho.
Por exemplo, a seguinte coleção sensorData
contém leituras de temperatura:
db.sensorData.insertMany( [ { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2022-01-15T00:00:00.000Z"), "temperatureReading": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2022-01-15T04:00:00.000Z"), "temperatureReading": 11 }, { "metadata": { "sensorId": 5579, "type": "temperature" }, "timestamp": ISODate("2022-01-15T08:00:00.000Z"), "temperatureReading": 9 } ] )
O seguinte comando cria um índice secundário ascendente composto nos campos timestamp
e metadata.sensorId
:
db.sensorData.createIndex( { "timestamp": 1, "metadata.sensorId": 1 } )
A seguinte operação de classificação no campo timestamp
utiliza o índice para melhorar o desempenho:
db.sensorData.find().sort( { "timestamp": 1 } )
Para confirmar que a operação de classificação utilizou o índice, execute a operação novamente com a opção .explain()
:
db.sensorData.find().sort( { "timestamp": 1 } ).explain()
O winningPlan.queryPlan.inputStage.stage
é IXSCAN
, o que indica que o índice foi utilizado. Para obter mais informações sobre como explicar a saída do plano, consulte Explicar resultados.
Especificar Dicas de Índice para Coleções de Séries Temporais
Sugestões de índice fazem com que MongoDB use um índice específico para uma query. Algumas operações em coleções de séries temporais só podem tirar proveito de um índice se esse índice for especificado em uma dica.
Por exemplo, a seguinte query faz com que MongoDB utilize o índice timestamp_1_metadata.sensorId_1
:
db.sensorData.find( { "metadata.sensorId": 5578 } ).hint( "timestamp_1_metadata.sensorId_1" )
Em uma coleção de séries temporais, você pode especificar dicas usando o nome do índice ou o padrão da chave do índice. Para obter os nomes dos índices em uma coleção, utilize o método db.collection.getIndexes()
.
Índices Secundários da Série Temporal
A partir do MongoDB 6.0 (e 5.0.16):
Você pode adicionar um índice composto em campos de tempo, metadados ou medição.
Você pode usar os operadores
$or
,$in
e$geoWithin
com índices parciais em uma coleção de séries temporais.Você pode adicionar índices dsphere parciais e 2 em qualquer campo em uma coleção de séries temporais.
Observação
Se houver coleções de séries temporais e você precisar fazer downgrade da versão de compatibilidade de recursos (FCV), primeiro descartará todos os índices secundários que são incompatíveis com o FCV rebaixado. Consulte setFeatureCompatibilityVersion
.