Docs Menu
Docs Home
/
MongoDB マニュアル
/

時系列コレクションのベストプラクティス

項目一覧

  • 挿入の最適化
  • ドキュメントのバッチ書込み (write)
  • ドキュメントでの一貫したフィールド順序の使用
  • クライアント数の増加
  • 圧縮の最適化
  • ドキュメントから空のオブジェクトと配列を含むフィールドを省略
  • 数値データを小数点以下の桁に丸めます
  • クエリ パフォーマンスの最適化

このページでは、時系列コレクションのパフォーマンスとデータ使用量を向上させるためのベストプラクティスについて説明します。

時系列コレクションの挿入パフォーマンスを最適化するには、次のアクションを実行します。

複数のドキュメントを挿入する場合

たとえば、 sensor Asensor 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 つ以上のセカンダリ インデックスtimeFieldmetaFieldに作成します。

戻る

時系列コレクションのシャード