時系列コレクションのベストプラクティス
項目一覧
このページでは、時系列コレクションのパフォーマンスとデータ使用量を向上させるためのベストプラクティスについて説明します。
挿入の最適化
時系列コレクションの挿入パフォーマンスを最適化するには、次のアクションを実行します。
ドキュメントのバッチ書込み (write)
複数のドキュメントを挿入する場合
ネットワーク上の往復を回避するには、複数の ステートメントではなく、単一の
insertMany()
insertOne()
ステートメントを使用します。可能であれば、シリーズごとに複数の測定値を含むバッチを作成します(メタデータによって定義)。
パフォーマンスを向上させるには、
ordered
パラメータをfalse
に設定します。
たとえば、 sensor A
とsensor B
の 2 つのセンサーがある場合、1 つのセンサーからの複数の測定値を含むバッチには、測定 1 件ごとに 1 回の挿入ではなく、1 回の挿入に対してコストが発生します。
次の操作では 6 つのドキュメントが挿入されますが、ドキュメントはセンサーの順序付けされているため、挿入コストは 2 回の挿入コスト(バッチあたり 1 回)のみになります。 パフォーマンスを向上させるために、 ordered
パラメータはfalse
に設定されています。
db.temperatures.insertMany( [ { "metadata": { "sensor": "sensorA" }, "timestamp": ISODate("2021-05-18T00:00:00.000Z"), temperature: 10 }, { "metadata": { "sensor": "sensorA" }, "timestamp": ISODate("2021-05-19T00:00:00.000Z"), temperature: 12 }, { "metadata": { "sensor": "sensorA" }, "timestamp": ISODate("2021-05-20T00:00:00.000Z"), temperature: 13 }, { "metadata": { "sensor": "sensorB" }, "timestamp": ISODate("2021-05-18T00:00:00.000Z"), temperature: 20 }, { "metadata": { "sensor": "sensorB" }, "timestamp": ISODate("2021-05-19T00:00:00.000Z"), temperature: 25 }, { "metadata": { "sensor": "sensorB" }, "timestamp": ISODate("2021-05-20T00:00:00.000Z"), temperature: 26 } ], { "ordered": false })
ドキュメントでの一貫したフィールド順序の使用
ドキュメントで一貫したフィールド順序を使用すると、挿入パフォーマンスが向上します。
たとえば、次のドキュメントを挿入すると、最適な挿入パフォーマンスが得られます。
{ _id: ObjectId("6250a0ef02a1877734a9df57"), timestamp: 2020-01-23T00:00:00.441Z, name: 'sensor1', range: 1 }, { _id: ObjectId("6560a0ef02a1877734a9df66") timestamp: 2020-01-23T01:00:00.441Z, name: 'sensor1', range: 5 }
対照的に、これらのドキュメントではフィールドの順序が異なるため、最適な挿入パフォーマンスは得られません。
{ range: 1, _id: ObjectId("6250a0ef02a1877734a9df57"), name: 'sensor1', timestamp: 2020-01-23T00:00:00.441Z }, { _id: ObjectId("6560a0ef02a1877734a9df66") name: 'sensor1', timestamp: 2020-01-23T01:00:00.441Z, range: 5 }
クライアント数の増加
コレクションにデータを書き込むクライアントの数を増やすと、パフォーマンスが向上します。
圧縮の最適化
時系列コレクションのデータ圧縮を最適化するには、次のアクションを実行します。
ドキュメントから空のオブジェクトと配列を含むフィールドを省略
圧縮を最適化するために、データに空のオブジェクトまたは配列が含まれている場合は、ドキュメントから空のフィールドを省略します。
例えば、次のドキュメントについて考えてみます。
{ time: 2020-01-23T00:00:00.441Z, coordinates: [1.0, 2.0] }, { time: 2020-01-23T00:00:10.441Z, coordinates: [] }, { time: 2020-01-23T00:00:20.441Z, coordinates: [3.0, 5.0] }
入力された値を持つ coordinates
フィールドと空の配列を持つフィールドとの間で、コンプレッサーのスキーマが変更されます。 スキーマの変更により、シーケンス内の 2 番目と 3 番目のドキュメントは非圧縮のままになります。
対照的に、空の配列 が省略されている次のドキュメントには、最適な圧縮のメリットが得られます。
{ time: 2020-01-23T00:00:00.441Z, coordinates: [1.0, 2.0] }, { time: 2020-01-23T00:00:10.441Z }, { time: 2020-01-23T00:00:20.441Z, coordinates: [3.0, 5.0] }
数値データを小数点以下の桁に丸めます
数値データをアプリケーションに必要な精度に丸めます。 数値データを小数点以下桁を丸めると、圧縮率が向上します。
クエリ パフォーマンスの最適化
クエリのパフォーマンスを向上させるには、一般的なクエリ パターンをサポートするために1 つ以上のセカンダリ インデックスをtimeField
とmetaField
に作成します。