Log エンジンファミリーに属します。Log エンジンの共通の特性と相違点については、Log エンジンファミリーの記事を参照してください。
Log は、カラムファイルとともに “marks” の小さなファイルが存在する点で TinyLog と異なります。これらのマークは各データブロックごとに書き込まれ、指定した行数をスキップするためにファイルのどこから読み取りを開始すべきかを示すオフセットを含みます。これにより、テーブルデータを複数のスレッドで読み取ることが可能になります。
同時実行のデータアクセスでは、読み取り操作は同時に実行できますが、書き込み操作は読み取り操作および他の書き込み操作をブロックします。
Log エンジンは索引をサポートしていません。同様に、テーブルへの書き込みに失敗すると、そのテーブルは破損した状態となり、そこから読み取るとエラーが返されます。Log エンジンは、一時データ、書き込みが 1 回限りのテーブル、およびテストやデモ用途に適しています。
テーブルの作成
データの書き込み
Log エンジンは、各カラムをそれぞれ専用のファイルに書き込むことで、データを効率的に格納します。テーブルごとに、Log エンジンは指定されたストレージパスに次のファイルを書き込みます。
<column>.bin: 各カラム用のデータファイルで、シリアライズおよび圧縮されたデータが格納されます。__marks.mrk: 挿入された各データブロックのオフセットと行数を格納する marks ファイルです。marks は、読み取り時にエンジンが不要なデータブロックをスキップできるようにすることで、クエリを効率的に実行できるようにします。
書き込みプロセス
Log テーブルに書き込まれるとき:
- データはシリアライズされ、ブロック単位で圧縮されます。
- 各カラムについて、圧縮されたデータが対応する
<column>.binファイルに追記されます。 - 対応するエントリが
__marks.mrkファイルに追加され、新たに挿入されたデータのオフセットと行数が記録されます。
データの読み取り
SELECT クエリが返す行の順序は一定ではありません。行をソートするには、ORDER BY 句を使用してください。
使用例
INSERT クエリを 2 つ使用して、<column>.bin ファイル内に 2 つのデータブロックを作成しました。
ClickHouse は、データを選択する際に複数のスレッドを使用します。各スレッドは別々のデータブロックを読み取り、処理が完了すると結果の行を独立して返します。そのため、出力内の行ブロックの順序は、入力内の同じブロックの順序と一致しないことがあります。たとえば、次のようになります。