Docs Menu
Docs Home
/
Manual de base de datos
/

Agregar índices secundarios a colecciones de series temporales

Para mejorar el rendimiento de las consultas En las colecciones de series temporales, agregue uno o más índices secundarios para admitir patrones comunes de consulta de series temporales. En concreto, recomendamos crear uno o más índices compuestos en los campos especificados como timeField y metaField. Si el valor del campo metaField corresponde a un documento, puede crear índices secundarios en los campos dentro de ese documento.

Nota

No se admiten todos los tipos de índice. Para obtener una lista de los tipos de índice no admitidos, consulte Limitaciones de los índices secundarios en colecciones de series temporales.

Por ejemplo, este comando crea un índice compuesto en los metadata.sensorId timestamp campos y:

db.weather24h.createIndex( { "metadata.sensorId": 1, "timestamp": 1 } )

Tip

Consulte:

Las colecciones de series temporales pueden usar índices para mejorar el rendimiento de clasificación en timeField y metaField.

Por ejemplo, la siguiente colección sensorData contiene mediciones de sensores meteorológicos:

db.sensorData.insertMany( [ {
"metadata": {
"sensorId": 5578,
"location": {
type: "Point",
coordinates: [-77.40711, 39.03335]
}
},
"timestamp": ISODate("2022-01-15T00:00:00.000Z"),
"currentConditions": {
"windDirecton": 127.0,
"tempF": 71.0,
"windSpeed": 2.0,
"cloudCover": null,
"precip": 0.1,
"humidity": 94.0,
}
},
{
"metadata": {
"sensorId": 5578,
"location": {
type: "Point",
coordinates: [-77.40711, 39.03335]
}
},
"timestamp": ISODate("2022-01-15T00:01:00.000Z"),
"currentConditions": {
"windDirecton": 128.0,
"tempF": 69.8,
"windSpeed": 2.2,
"cloudCover": null,
"precip": 0.1,
"humidity": 94.3,
}
},
{
"metadata": {
"sensorId": 5579,
"location": {
type: "Point",
coordinates: [-80.19773, 25.77481]
}
},
"timestamp": ISODate("2022-01-15T00:01:00.000Z"),
"currentConditions": {
"windDirecton": 115.0,
"tempF": 88.0,
"windSpeed": 1.0,
"cloudCover": null,
"precip": 0.0,
"humidity": 99.0,
}
}
]
)

Las colecciones de series temporales crean automáticamente un índice agrupado interno. El planificador de consultas utiliza este índice para mejorar el rendimiento de la ordenación.

Nota

Si inserta un documento en una colección con un timeField valor antes de 1970-01-01T00:00:00.000Z o después 2038-01-19T03:14:07.000Z de, MongoDB registra una advertencia e impide que algunas optimizaciones de consultas utilicen el índice interno. Cree un índice secundario en timeField para recuperar el rendimiento de las consultas y resolver la advertencia del registro.

La siguiente operación de ordenamiento en el campo timestamp utiliza el índice agrupado para mejorar el rendimiento:

db.sensorData.find().sort( { "timestamp": 1 } )

Para confirmar que la operación de ordenamiento utilizó el índice agrupado, ejecute la operación nuevamente con la opción .explain( "executionStats" ):

db.sensorData.find().sort( { "timestamp": 1 } ).explain( "executionStats" )

El winningPlan.queryPlan.inputStage.stage es COLLSCAN y _internalBoundedSort hay una etapa en el resultado del plan de explicación. El interalBoundedSort campo indica que se utilizó el índice agrupado. Para obtener más información sobre el resultado del plan de explicación, consulte los resultados de la explicación.

Los índices secundarios en colecciones de series temporales pueden mejorar el rendimiento de las operaciones de clasificación y aumentar la cantidad de escenarios en los que se pueden utilizar índices.

Las operaciones de ordenación en colecciones de series temporales pueden usar índices secundarios en timeField. En ciertas circunstancias, también pueden usar índices secundarios compuestos en metaField y timeField.

Las etapas $match y $sort del pipeline de agregación determinan qué índices puede usar una colección de series temporales. La siguiente lista describe escenarios en los que se puede usar un índice:

  • La ordenación por { <timeField:> ±1 } utiliza el índice agrupado

  • La ordenación en { <timeField>: ±1 } utiliza un índice secundario en <timeField>

  • La ordenación en { <metaField>: ±1, timeField: ±1 } utiliza un índice secundario en { <metaField>: ±1, timeField: ±1 }

  • La ordenación en { <timeField>: ±1 } utiliza un índice secundario en { metaField: ±1, timeField: ±1 } cuando hay un predicado de punto en <metaField>

Crea un índice secundario en el campo timestamp:

db.sensorData.createIndex( { "timestamp": 1 } )

La siguiente operación de clasificación en el campo timestamp utiliza el índice secundario para mejorar el rendimiento:

db.sensorData.aggregate( [
{ $match: { "timestamp" : { $gte: ISODate("2022-01-15T00:00:00.000Z") } } },
{ $sort: { "timestamp": 1 } }
] )

Para confirmar que la operación de clasificación utilizó el índice secundario, ejecute la operación nuevamente con la opción .explain( "executionStats" ):

db.sensorData.explain( "executionStats" ).aggregate( [
{ $match: { "timestamp": { $gte: ISODate("2022-01-15T00:00:00.000Z") } } },
{ $sort: { "timestamp": 1 } }
] )

Una consulta de "último punto" obtiene la última medición de cada valor de metadatos único. Por ejemplo, podría querer obtener la última lectura de temperatura de todos los sensores. Mejore el rendimiento de las consultas de último punto creando cualquiera de los siguientes índices:

{ "metadata.sensorId": 1, "timestamp": 1 }
{ "metadata.sensorId": 1, "timestamp": -1 }
{ "metadata.sensorId": -1, "timestamp": 1 }
{ "metadata.sensorId": -1, "timestamp": -1 }

Nota

Las consultas de último punto alcanzan su máximo rendimiento cuando utilizan la optimización DISTINCT_SCAN. Esta optimización solo está disponible cuando un índice en timeField es descendente.

El siguiente comando crea un índice secundario compuesto en metaField (ascendente) y timeField (descendente):

db.sensorData.createIndex( { "metadata.sensorId": 1, "timestamp": -1 } )

El siguiente ejemplo de consulta de último punto utiliza el índice secundario compuesto descendente timeField creado anteriormente:

db.sensorData.aggregate( [
{
$sort: { "metadata.sensorId": 1, "timestamp": -1 }
},
{
$group: {
_id: "$metadata.sensorId",
ts: { $first: "$timestamp" },
temperatureF: { $first: "$currentConditions.tempF" }
}
}
] )

Para confirmar que la última consulta de punto utilizó el índice secundario, ejecute la operación nuevamente usando .explain( "executionStats" ):

db.getCollection( 'sensorData' ).explain( "executionStats" ).aggregate( [
{
$sort: { "metadata.sensorId": 1, "timestamp": -1 }
},
{
$group: {
_id: "$metadata.sensorId",
ts: { $first: "$timestamp" },
temperatureF: { $first: "$currentConditions.tempF" }
}
}
] )

El winningPlan.queryPlan.inputStage.stage DISTINCT_SCANes, lo que indica que se utilizó el índice. Para obtener más información sobre la salida del plan de explicación, consulte Resultados de Explain.

Las sugerencias de índice hacen que MongoDB utilice un índice específico para una consulta. Algunas operaciones en colecciones de series temporales solo pueden aprovechar un índice si este se especifica en una sugerencia.

Por ejemplo, la siguiente consulta hace que MongoDB utilice el índice timestamp_1_metadata.sensorId_1:

db.sensorData.find( { "metadata.sensorId": 5578 } ).hint( "timestamp_1_metadata.sensorId_1" )

En una colección de series temporales, se pueden especificar sugerencias mediante el nombre del índice o el patrón de clave del índice. Para obtener los nombres de los índices de una colección, utilice el db.collection.getIndexes() método.

A partir de MongoDB 6.0, puedes:

Nota

Si existen índices secundarios en colecciones de series temporales y necesita degradar la versión de compatibilidad de características (FCV), primero debe eliminar los índices secundarios incompatibles con la FCV degradada. Para obtener más información,setFeatureCompatibilityVersion consulte.

Volver

Establece la granularidad para los datos de series de tiempo

En esta página