Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
データベース マニュアル
/

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

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

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

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

たとえば、 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に作成します。

時系列コレクションは一意のデータ構造であるため、MongoDB は個別の値に対して効率的にインデックスを作成できません。時系列コレクションで distinct コマンドまたは db.collection.distinct() ヘルパーメソッドを使用しないでください。代わりに、$group 集計を使用して、ドキュメントを個別の値でグループ化します。

たとえば、meta.project = 10 であるドキュメントに対して meta.type の値を個別でクエリするには、次のようにします。

db.foo.distinct("meta.type", {"meta.project": 10})

次を使用します。

db.foo.createIndex({"meta.project":1, "meta.type":1})
db.foo.aggregate([{$match: {"meta.project": 10}},
{$group: {_id: "$meta.type"}}])

これは、次のように機能します。

  1. meta.projectmeta.type複合インデックスを作成し、集計をサポートする。

  2. $match ステージが meta.project = 10 のドキュメントにフィルターをかける。

  3. $group ステージでは、meta.type をグループキーとして使用して、一意の値ごとに 1 つのドキュメントを出力する。

戻る

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