在 metaField 和 timeField 上添加二级索引
要提高 时间序列集合的查询性能,请添加一个或多个 二级索引,以支持常见的时间序列查询模式。具体来说,我们建议您在指定为 timeField
和 metaField
字段上创建一个或多个复合索引。如果 metaField
字段的字段值是文档,则可以在该文档内的字段上创建二级索引。
注意
并非所有索引类型都受支持。有关不支持的索引类型的列表,请参阅时间序列集合二级索引的限制。
例如,此命令在metadata.sensorId
和timestamp
字段上创建复合索引:
db.weather24h.createIndex({ "metadata.sensorId": 1, "timestamp": 1 })
使用二级索引提高排序性能
timeField
和metaField
上的排序操作可以在这些字段上使用二级索引来提高性能。
例如,以下sensorData
集合包含温度读数:
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 } ] )
以下命令在 timestamp
和 metadata.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.stage
为IXSCAN
,表示使用了该索引。 有关解释计划输出的更多信息,请参阅解释结果。
为时间序列集合指定索引提示
索引提示导致 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 )开始:
您可以在时间、元数据或测量字段上添加复合索引。
您可以将
$or
、$in
和$geoWithin
操作符与时间序列集合上的部分索引一起使用。您可以在 时间序列集合 中的任何字段上添加 部分 索引和2 dsphere 索引。
注意
如果在时间序列集合上具有二级索引,并且您需要降级特征兼容性版本 (FCV),必须先删除与降级 FCV 不兼容的任何二级索引。请参阅 setFeatureCompatibilityVersion
。