ClickHouse でテーブルを作成する
多くのデータベースと同様に、ClickHouse はテーブルを論理的にグループ化し、データベース として管理します。ClickHouse で新しいデータベースを作成するには、CREATE DATABASE コマンドを使用します。
同様に、新しいテーブルを定義するには CREATE TABLE を使用します。データベース名を指定しない場合、テーブルは
default データベース内に作成されます。
以下のテーブル my_first_table は、helloworld データベース内に作成されます。
上記の例では、my_first_table は 4 つのカラムを持つ MergeTree テーブルです。
user_id: 32 ビットの符号なし整数message: 他のデータベースシステムにおけるVARCHAR、BLOB、CLOBなどの型を置き換えるStringデータ型timestamp: ある時点を表すDateTime値metric: 32 ビットの浮動小数点数
テーブルエンジンは次の点を決定します。
- データがどのように、どこに保存されるか
- どのクエリが実行できるか
- データがレプリケーションされるかどうか
選択できるエンジンは多数ありますが、単一ノードの ClickHouse サーバー上にシンプルなテーブルを作成する場合は、MergeTree が最も一般的な選択肢となるでしょう。
プライマリキーの概要
先に進む前に、ClickHouse におけるプライマリキーの仕組みを理解しておくことが重要です(プライマリキーの実装は 少し意外に思えるかもしれません!):
- ClickHouse におけるプライマリキーは、テーブル内の各行ごとに 一意である必要はありません
ClickHouse テーブルのプライマリキーは、データがディスクに書き込まれる際のソート方法を決定します。8,192 行ごと、または
10MB ごとのデータ(インデックス粒度と呼ばれます)ごとに、プライマリキーインデックスファイルにエントリが作成されます。
この粒度という考え方により、メモリに容易に収まる 疎なインデックス が構成され、各グラニュールは SELECT クエリ実行時に
処理されるカラムデータの最小単位となるストライプを表します。
プライマリキーは PRIMARY KEY パラメータを使って定義できます。PRIMARY KEY を指定せずにテーブルを定義した場合、
キーは ORDER BY 句で指定されたタプルになります。PRIMARY KEY と ORDER BY の両方を指定する場合、プライマリキーはソート順の
プレフィックスでなければなりません。
プライマリキーはソートキーも兼ねており、ここでは (user_id, timestamp) というタプルです。そのため、各カラムファイルに保存されるデータは
まず user_id で、次に timestamp でソートされます。
詳細については、ClickHouse Academy の Modeling Data トレーニングモジュール を参照してください。