時系列データのクエリについて
MongoDB は、時系列データのストレージとクエリレイテンシを最適化するために、一致する metaFields を持つドキュメントをグループ化します。 metaField
の選択は、アプリケーションでのクエリの最適化に最も大きな影響を与えます。
metaField のクエリ
時系列コレクションのクエリは、標準の MongoDB コレクションのクエリと同じ方法で実行します。クエリの例と集計パイプラインの例については、「時系列コレクションのクエリ」を参照してください。クエリのベストプラクティスのリストについては、「クエリのベストプラクティス」を参照してください。
時系列データに対するクエリは通常、コレクション内の単一の時系列に焦点を当てます。たとえば、次のスキーマを使用した、株価データを追跡する時系列コレクションについて考えてみましょう。
{ _id: 573a1397f29313caabce8347, "ticker": "MDB", "timestamp": ISODate("2024-07-24T13:45:00.000Z"), "price": 248.21, "volume": 6930 }
コレクションには、次の設定があります。
timeseries: { timeField: "timestamp", metaField: "ticker", granularity: "seconds" }
MongoDB は、ticker
値が一致するドキュメントをグループ化します。すべてのドキュメントのすべてのフィールドで一致を確認する代わりに、サーバーは metaField
(この場合は ticker
)と照合するだけで、検索範囲を一意の時系列に絞り込むことができます。これは、単一の株式のアクティビティを検索するという、予想されるユースケースと一致します。MongoDB(MDB)の株式情報を検索するユーザーは、Amazon(AMZN)の結果を考慮する必要はありません。
timeField のクエリ
時系列データをクエリするための 2 番目の主要な要素は時間です。MongoDB は同じ metaField
値と近い timeField
値の両方を持つドキュメントをグループ化するため、クエリの範囲はさらにバケットの範囲に絞り込まれます。最近のトランザクションはメモリ内に保存されるため、簡単にリアルタイムでデータをストリーミングできます。
ブロック プロセシング
バージョン8.0以降、 MongoDB は、ブロック処理を使用して特定の時系列クエリを実行する場合があります。 このパフォーマンス向上により、クエリは個々の値ではなく、データの「ブロック」単位で処理されます。 ブロック処理 により、時系列コレクションを操作する際のクエリ実行速度とスループットが向上します。
ブロック処理により、パフォーマンスが大幅に向上し、次のステージから始まる長時間実行中される集計パイプラインのオーバーヘッドが削減されます。
MongoDB は、適格な時系列クエリに対してブロック処理を自動的に有効にします。クエリがブロック処理を使用するかどうかを手動で指定することはできません。
時系列クエリでブロック処理が使用されているかどうかを確認するには、説明プランの出力の stages
を参照してください。