基本概念
アーキテクチャー、設計原則、主要な概念を詳しく説明します。内部動作と、時系列データに最適化されている理由を理解できます。
このセクションの内容
時系列データの理解
時系列データの特徴と、従来の DB で扱いにくい理由を説明します。
- 時系列ワークロードの特性
- 書き込み中心と読み取り中心のパターン
- 追記専用設計の意義
- 時刻ベースの分割と圧縮
テーブルの種類
適切なテーブルの選択方法を説明します。
- 4 種類の詳細比較
- 選択フローチャートとガイド
- 性能特性
- 一般的な用途と避けるべき使い方
- 各型の使い分け
インデックスと性能
高い性能を実現する仕組みを説明します。
- Tag のパーティションインデックス
- LSM(Log-Structured Merge)
- 自動インデックス管理
- クエリー最適化
- ロールアップ統計
対象読者
次の方を対象とします。
- Machbase アプリケーションを設計する開発者
- システムを設計するアーキテクト
- 性能を調整する DBA
- データパイプラインを実装するデータエンジニア
前提条件
次を確認してから進めてください。
学習の順序
次の順を推奨します。
- 時系列データ:対象データの理解
- テーブルの種類:適切な選択
- インデックス:性能の最適化
クイックリファレンス
テーブルの選択
センサーデータ(ID、時刻、値)ですか?
はい → Tag テーブル
ログやイベントですか?
はい → Log テーブル
メモリ内で UPDATE/DELETE が必要ですか?
はい → Volatile テーブル
参照データやマスターですか?
はい → Lookup テーブル性能特性
| 型 | 書き込み | 読み取り | UPDATE/DELETE | 保存先 |
|---|---|---|---|---|
| Tag | 毎秒数百万 | 非常に高速 | UPDATE 不可*、DELETE は時刻条件 | ディスク |
| Log | 毎秒数百万 | 高速 | UPDATE 不可、DELETE は時刻条件 | ディスク |
| Volatile | 毎秒数万 | 非常に高速 | キー指定 | メモリ |
| Lookup | 毎秒数百 | 高速 | キー指定 | ディスク |
*Tag のメタデータは更新できます。
主な概念
追記専用の設計
追記中心のデータに最適化されています。
- 行単位のロックなし
- 高速な順次書き込み
- ログの上書きを防ぎ、整合性を維持
時刻によるパーティション分割
時刻に基づいて自動的に分割します。
- 効率的な期間検索
- 保持期間の管理が容易
- 圧縮の最適化
列指向の圧縮
列ごとに保存します。
- 10 ~ 100 倍の圧縮率
- 高速な分析クエリー
- ストレージコストの削減
ロールアップ(Tag)
ロールアップを設定すると、統計を利用できます。
- 秒、分、時間単位の集計
- MIN、MAX、AVG、SUM、COUNT、SUMSQ
- 手動の集計処理が不要
よくある誤解
「クエリーごとにインデックスを作る必要がある」
多くの場合は不要です。自動的に適した構造を使用します。
- Tag:3 階層のパーティションインデックス
- Log:時刻による分割(インデックスは任意)
- Volatile:PRIMARY KEY の RED-BLACK ツリー
- 多くの検索は手動の追加なしで実行可能
「センサーごとにテーブルを作るべき」
通常は、1 つの Tag テーブルにまとめます。
- 性能の改善
- 管理の簡略化
- 自動最適化
「Lookup は遅い」
書き込みと読み取りで特性が異なります。
- 書き込みは低速(毎秒数百万に対し数百程度)
- 読み取りは高速(SELECT 向け)
- 大量入力ではなく参照データに使用
「Volatile は通常のテーブルと同じ」
次の特性に注意してください。
- すべてメモリ上に保存
- 停止時にデータを喪失
- 一時データやキャッシュに使用
設計原則
1.適切なテーブルを選ぶ
用途に合う型を選択します。
- センサーデータ:Tag
- イベント:Log
- リアルタイムキャッシュ:Volatile
- 参照データ:Lookup
2.時刻に基づく機能を活用
時系列向けの機能を使用します。
-- 推奨:DURATION を使用
SELECT * FROM logs DURATION 1 HOUR;
-- 比較的効率が低い例:手動の時刻条件
SELECT * FROM logs
WHERE _arrival_time BETWEEN TO_DATE('2025-10-10 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE('2025-10-10 15:00:00', 'YYYY-MM-DD HH24:MI:SS');3.保持期間を設定
データが無制限に増えないよう管理します。
-- 日次の削除
DELETE FROM logs EXCEPT 30 DAY;4.分析にロールアップを使用
事前に集計したデータを検索します。
-- ロールアップによる時間単位の集計
SELECT rollup('hour', 1, time) AS hour_time, AVG(value)
FROM sensors
GROUP BY hour_time;
-- 元データからセンサー別に集計(上の例とは集計単位が異なる)
SELECT sensor_id, AVG(value) FROM sensors GROUP BY sensor_id;アーキテクチャーの概要
ストレージ層
┌─────────────────────────────────────┐
│ クエリーエンジン │
├─────────────────────────────────────┤
│ メモリ管理 │
│ ┌──────────────┐ ┌──────────────┐│
│ │ Volatile │ │ 検索キャッシュ││
│ │ テーブル │ │ ││
│ └──────────────┘ └──────────────┘│
├─────────────────────────────────────┤
│ ストレージエンジン │
│ ┌──────────────┐ ┌──────────────┐│
│ │ Tag/Log │ │ Lookup ││
│ │ テーブル │ │ テーブル ││
│ └──────────────┘ └──────────────┘│
└─────────────────────────────────────┘データの流れ
センサー / アプリケーション
↓
APPEND API(一括入力)
↓
書き込みバッファー(メモリ)
↓
ディスクへフラッシュ(圧縮)
↓
自動インデックス構築
↓
クエリーエンジン次のステップ
詳しくは、次の順に参照してください。
関連するガイド:
- 最初の操作:machsql の実践
- テーブルの種類:各型の詳細
- SQL リファレンス:構文
さらに詳しく
- 高度な機能:STREAM、ロールアップ
- 設定:サーバー調整
- トラブルシューティング:性能の改善
これらの概念を基に、効率的で拡張しやすいアプリケーションを設計できます。
最終更新日