Docs 菜单

Docs 主页开发应用程序MongoDB Manual

在 metaField 和 timeField 上添加二级索引

在此页面上

  • 使用二级索引提高排序性能
  • 为时间序列集合指定索引提示
  • 时间序列二级索引

要提高时间序列集合的查询性能,请添加一个或多个二级索引以支持常见的时间序列查询模式。 具体来说,我们建议您在指定为 timeFieldmetaField的字段上创建一个或多个复合索引。 如果metaField字段的字段值是文档,则可以在该文档内的字段上创建二级索引。

注意

并非所有索引类型都受支持。有关不支持的索引类型的列表,请参阅时间序列集合二级索引的限制

例如,此命令在metadata.sensorIdtimestamp字段上创建复合索引

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

提示

请参阅:

timeFieldmetaField上的排序操作可以在这些字段上使用二级索引来提高性能。

例如,以下sensorDatacollection包含温度读数:

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
}
] )

以下命令在timestampmetadata.sensorId字段上创建复合升序二级索引:

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

以下对timestamp字段的排序操作使用索引来提高性能:

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

要确认排序操作使用了索引,请使用.explain()选项再次运行该操作:

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

winningPlan.queryPlan.inputStage.stageIXSCAN ,表示使用了该索引。有关解释计划输出的更多信息,请参阅解释结果。

索引提示导致 MongoDB 使用特定的索引进行查询。如果在提示中指定了一个索引,对时间序列集合的某些操作只能利用该索引。

例如,以下查询会促使 MongoDB 使用 timestamp_1_metadata.sensorId_1 索引:

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

在时间序列集合上,您可以使用索引名称或索引键模式指定提示。要获取集合上的索引名称,请使用 db.collection.getIndexes() 方法。

从 MongoDB 6开始。 0 (以及5 . 0 . 16 ):

注意

如果 时间序列集合 上有 二级索引 ,并且需要降级特征兼容性版本 (fCV),则必须先删除与降级 fCV 不兼容的所有二级索引。请参阅setFeatureCompatibilityVersion

← 设置时间序列数据的粒度