Docs Menu
Docs Home
/ /

Agregar índices secundarios a colecciones de series temporales

Para mejorar el rendimiento de las consultas Colecciones de series temporales: agregue uno o más índices secundarios para admitir patrones comunes de consulta de series temporales. A partir de MongoDB,6.3 MongoDB crea automáticamente un índice compuesto en metaField y timeField campos para nuevas colecciones.

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.

Quizás desee crear índices secundarios adicionales. Considere una recopilación de datos meteorológicos con la configuración:

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata"
}})

En cada documento de datos meteorológicos, el valor del campo metadata es un subdocumento con campos para el ID y el tipo del sensor meteorológico:

{
"timestamp": ISODate("2021-05-18T00:00:00.000Z"),
"metadata": {
"sensorId": 5578,
"type": "temperature"
},
"temp": 12
}

El índice compuesto predeterminado de la colección indexa todo el metadata subdocumento, por lo que solo se utiliza con consultas. Al $eq indexar metadata campos específicos, se mejora el rendimiento de las consultas de otros tipos.

Por ejemplo, esta $in consulta se beneficia de un índice secundario metadata.type en:

{ metadata.type:{ $in: ["temperature", "pressure"] }}

Tip

Consulte:

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

Las etapas del pipeline de agregación $match y $sort determinan qué índices puede utilizar una colección de series de tiempo. Un índice puede usarse en los siguientes escenarios:

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

  • La ordenación por { <metaField>: ±1, timeField: ±1 } utiliza el índice compuesto predeterminado 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>

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

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

Cree un índice secundario de campo único 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 } }
] )

En datos de series temporales, una consulta de último punto devuelve el punto de datos con la última marca de tiempo para un campo determinado. En colecciones de series temporales, 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 la versión 6.0, puede crear índices 2dsphere en los campos timeField, metaField o de medición.

Por ejemplo, la siguiente operación crea un índice 2dsphere en el campo location:

Ejemplo

db.sensorData.createIndex({ "metadata.location": "2dsphere" })

Además, la siguiente operación crea un índice 2dsphere en los campos de medición:

Ejemplo

db.sensorData.createIndex({ "currentConditions.tempF": "2dsphere" })

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

Indexes

En esta página