ロコ
February 7, 2026

時系列DBについて学ぼう

投稿日 February 7, 2026  •  2分で読めます  • 253文字  • 言語を選択:  KoreanEnglish
Table of contents

大規模アーキテクチャを設計したり、分散システムを構築しようとする際にTime Series Database(TSDB) の導入を検討することができる。今日はTSDBがどのようなツールであるか、どのような特徴を持っているか、そしてどのような問題を解決するのに役立つかを見ていこう。

1. 時系列データとは?

TSDBは時系列データを保存し処理するデータベースである。では、時系列データとは何か?時系列データは単にタイムスタンプが付いているデータではない。より正確には_「時間に沿って追跡、モニタリング、ダウンサンプリング、集計される測定値またはイベント」_と定義でき、ここでいう測定値またはイベントには以下のようなものが含まれる。

このようなデータを扱う時系列データは、一般的なDBとは異なり、以下のような差別化ポイントを持つ。

これらの特性に対応するためにTSDBがどのような戦略を取るかを見ていこう。

2. 書き込み最適化

一般的なDBの場合、データを書き込むには書き込む位置を見つけて修正または挿入する作業を行う必要がある。以下のような形で作業が進行するだろう。

[Seek to block 4752][Read][Modify][Write][Seek to block 9201] → ...

一方、TSDBは既存のデータを修正する必要がなく、時間順にデータを積載すればよいので、Append-only方式でデータを追加するだけでよい。以下のように作業がはるかに単純化される。

[Write to end][Write to end][Write to end] → ...

LSM(Log-Structured Merge)ツリー

LSMツリーはInfluxDB、Cassandra、LevelDBなど高性能の書き込みスループットを誇るデータベースシステムの秘伝のソースだ。LSMツリーの核心アイデアは次の通りである。

そしてLSMツリーの動作方式は以下の通りである。

  1. 最新データはMemtableメモリバッファに保存

データはキー順に整列を維持する。この時、書き込み作業はRAMにアクセスするため速度が非常に速い。

  1. SSTable(Sorted String Table)ディスクにフラッシュ

Memtableがいっぱいになると、変更不可能で整列されたSSTableファイルとして保存される。Memtableはすでに整列されているため、このフラッシュ作業は順次的に簡単かつ迅速に完了できる。またフラッシュ作業後はMemtableを空にして初期化する。

  1. バックグラウンド圧縮

バックグラウンドでは小さなSSTableをより大きなSSTableにマージする作業を行う。また重複エントリとトゥームストーン(削除対象マーク)を除去することもある。

このようなLSMツリーの動作方式により、書き込み作業は読み取り作業を妨げない。 Memtableは常に最新データを処理し、バックグラウンドで既存のデータを整理することで、継続的に高い書き込みスループットを維持できる。

しかしクエリのために複数のSSTableを確認しなければならない場合には読み取り性能低下が生じる可能性がある。また書き込み増幅が発生した場合、圧縮過程でデータが複数回再書き込みされる可能性がある。

したがってLSMツリーは書き込み作業量が多く、読み取り性能はある程度犠牲にできる場合に活用するのが良い。

3. 時間ベースのインデックシングとパーティショニング

時系列データはすでにタイムスタンプベースで整列されて挿入されるため、書き込み作業にインデックシングが必要ない。そして時間範囲に応じてパーティショニングすれば、書き込み作業時にどのパーティションにデータを保存するか悩む必要がなくなる。データ保存作業も古いパーティションを削除する方式で簡単に進行できる。

ブロックレベルメタデータ

TSDBではデータブロックもタイムスタンプベースで整列されている。したがって時間範囲に該当しないブロックはチェックなしでスキップでき、これによりクエリ性能が向上する。各ブロックには時間に対する最小/最大タイムスタンプ、必要に応じて最小/最大値を記録しておく。このようなメタデータは時間ベースのパーティショニングと共に、データ量が増えてもクエリ性能を維持できるようにするフィルタレイヤーとして作用する。

4. ダウンサンプリングと圧縮

時系列データは特性上、重要でない内容を削ぎ落として圧縮して表現するのに適している。いや、実際には毎秒数百万のデータポイントが継続的に流入するというTSDBの特性上、ダウンサンプリング作業は必須とも言える。TSDBでは高い精度を持つ最新データは集計およびダウンサンプリングされて長期データに変換される。一般的なダウンサンプリングおよびリテンション戦略は次の通りである。

このようなルールはユーザーが直接定義でき、これを活用してストレージ効率性および読み取り性能を飛躍的に向上させることができる。

5. 圧縮アルゴリズム

前述の通り、TSDBの核心は多数の書き込み演算をメモリバッファで処理することと、バックグラウンドで圧縮する作業と言える。ではどのように圧縮するのか?その部分についての概念を見ていこう。

デルタエンコーディング

Raw values:     [45.2] [45.3] [45.1] [45.4]
Delta encoded:  [45.2] [+0.1] [-0.2] [+0.3]

デルタエンコーディングは元の値からどれだけ変わったか変化量だけを記録するように変える作業である。変化値は元の値より小さい数字なので、値を保存するのに必要なbit数もはるかに少なくなる。

デルタオブデルタエンコーディング

Raw timestamps:     1000, 1010, 1020, 1030, 1040
Deltas:             10  , 10  , 10  , 10  , 10  , ...
Delta-of-deltas:    10  , 0   , 0   , 0   , 0   , ...

デルタオブデルタエンコーディングはさらに進んで変化量に対する変化量を記録する方式である。これはタイムスタンプ間隔が完全に規則的な場合に使用できる方法であり、bit数をさらに減らすことができる。

XOR圧縮

Value 1: 0 10000010 01101000101000111101011
Value 2: 0 10000010 01101000110000100000000
XOR:     0 00000000 00000000011000011101011
                    ^^^^^^^^^^ lots of leading zeros

XOR圧縮は連続したfloatベースの値がしばしば類似した値を持つという点を活用する圧縮アルゴリズムである。上記のように同一のbit部分をすべて0に置換して全体のbit数を大幅に減らすことができる方式である。Metaが開発したゴリラ圧縮技法もこれに該当する。

Run-lengthエンコーディング

Run-lengthエンコーディングはモニタリング指標のように測定値が繰り返し現れる場合に、該当値をカウントと共に一つだけ保存する方式である。ログイン回数、リクエスト数などを記録する際に有用である。

6. TSDB選択ガイド

最後にどのような状況でどのTSDBを活用するのが良いかまとめてみよう。

InfluxDB

Prometheus

TimescaleDB

Kdb

Graphite

References

Contact me

email: nmin1124@gmail.com