Log
エンジンは Log
エンジンのファミリーに属します。Log
エンジンの一般的なプロパティとその違いについては、Log Engine Familyの記事を参照してください。
Log
は、TinyLog とは異なり、カラムファイルとともに小さな「マーク」ファイルが存在します。これらのマークは、各データブロックに書き込まれ、指定された行数をスキップするためにファイルを読み始めるオフセットを含んでいます。これにより、テーブルデータを複数のスレッドで読み取ることが可能になります。
同時データアクセスのため、読み取り操作は同時に実行できますが、書き込み操作は読み取りと互いをブロックします。
Log
エンジンはインデックスをサポートしていません。同様に、テーブルへの書き込みが失敗した場合、そのテーブルは壊れ、読み取り時にエラーが返されます。Log
エンジンは、一時的なデータや一度書き込み専用のテーブル、テストやデモ目的に適しています。
テーブルの作成
CREATE TABLE クエリの詳細な説明を参照してください。
データの書き込み
Log
エンジンは、各カラムをそれぞれのファイルに書き込むことで効率的にデータを保存します。各テーブルについて、Log エンジンは指定されたストレージパスに以下のファイルを書き込みます:
<column>.bin
: 各カラムのデータファイルで、シリアライズおよび圧縮されたデータが含まれています。__marks.mrk
: マークファイルで、挿入された各データブロックのオフセットと行数を保存しています。マークは、エンジンが読み取り時に無関係なデータブロックをスキップできるようにすることで、効率的なクエリ実行を促進します。
書き込みプロセス
Log
テーブルにデータが書き込まれるとき:
- データはブロックにシリアライズされ、圧縮されます。
- 各カラムについて、圧縮されたデータがそれぞれの
<column>.bin
ファイルに追加されます。 - 新しく挿入されたデータのオフセットと行数を記録するために、
__marks.mrk
ファイルに対応するエントリが追加されます。
データの読み取り
マークファイルにより、ClickHouseはデータの読み取りを並行処理できます。これは、SELECT
クエリが行を予測不可能な順序で返すことを意味します。行をソートするには、ORDER BY
句を使用してください。
使用例
テーブルの作成:
データの挿入:
私たちは、<column>.bin
ファイル内に2つのデータブロックを作成するために、2つの INSERT
クエリを使用しました。
ClickHouseは、データを選択する際に複数のスレッドを使用します。各スレッドが別々のデータブロックを読み取り、完了次第に結果行を独立して返します。その結果、出力の行ブロックの順序は、入力の同じブロックの順序と一致しない可能性があります。例えば:
結果をソートする(デフォルトで昇順):