metaField と timeField にセカンダリ インデックスを追加する
時系列コレクションのクエリ パフォーマンスを向上させるには、一般的な時系列クエリ パターンをサポートするために 1 つ以上のセカンダリ インデックスを追加します。 具体的には、 timeField
およびmetaField
として指定されたフィールドに 1 つ以上の複合インデックスを作成することをお勧めします。 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
を参照してください。