アイキャッチ画像: ClickHouseとは:特徴とステップバイステップのインストール(2026年ガイド)

ClickHouseとは:特徴とステップバイステップのインストール(2026年ガイド)

公開日:

読了時間: 3 min

テーマ: テクノロジー

著者: Leandro Valencia

#ClickHouse#OLAP#分析#オープンソース#セルフホスト#SQL

メイカー向けのClickHouse実践ガイド:概要、なぜ高速なのか、主要機能、curlやDockerで5分でインストールする方法。

目次

ClickHouseとは(マーケティング抜きで)

ClickHouseはオープンソースのカラム型分析データベースで、C++で書かれ、計測エラーに見えるほどの速度で大規模データに対する集計クエリを実行するために設計されています。

重要な単語は分析です。データベース用語では、これはOLAP(Online Analytical Processing)を意味し、PostgreSQLやMySQLがやるOLTP(Online Transaction Processing)と対比されます。

この違いは見た目以上に重要です:

OLTP(Postgres、MySQL、SQLite) は、個々の行を非常に高速に読み書きするよう最適化されています。「ユーザー4821をちょうだい」「この注文のステータスを更新して」。1秒間に数千の小さな操作で、トランザクションと強い一貫性付きで。

OLAP(ClickHouse、DuckDB、BigQuery) は、多数の行を読むが少数のカラムことを最適化しています。「過去90日間の国別売上の合計をちょうだい」。特定の1行には関心がなく、数百万行をスイープして1つの数値に還元することに関心があります。

このカテゴリの完全なコンテキスト(歴史、ユースケース、ベンダーマップ)をご希望なら、**OLAPデータベースとは**で扱っています。

これを可能にする技術的な鍵はカラム型ストレージです。行指向データベースはディスクにこう保存します:

[id:1, país:ES, ingresos:42, timestamp:...][id:2, país:MX, ingresos:17, timestamp:...]

ingresosカラムを合計したければ、関心のないpaístimestampを含めすべてを読まなければなりません。ClickHouseは各カラムを別々のファイルに保存します:

ingresos: [42, 17, 88, 12, ...]
país:     [ES, MX, ES, AR, ...]

ingresosを合計するにはそのファイルだけ読めば済みます。テーブルが40カラムあってクエリが2つしか使わなければ、データの5%しか読んでいません。ここから魔法が始まり、残りはすべてそれを増幅します。

なぜこれほど速いのか:4つの本当の理由

1. 残酷な圧縮。 同じ型の値を一緒に、しかもソートして保存すると、パターンが繰り返され、圧縮アルゴリズムが非常に効率的になります。ClickHouseのドキュメントは、フリーテキストで2xから、うまくソートされた低カーディナリティカラムでは1,000x以上に至る圧縮比を示しています。ディスク上のバイト数が少ない = I/Oが少ない = クエリが速い。

2. スパースプライマリインデックス。 ClickHouseは行ごとに1エントリのBツリーインデックスを作りません。スパースインデックスを作ります:8,192行(1「グラニュール」)ごとに1エントリ。これはテラバイトあたり数メガバイトのインデックスを意味し、RAMに難なく収まります。代償として、ClickHouseは厳密な1行を探すのではなく、それがあるブロックを探します。分析にとってはまさに正しいトレードオフです。

3. ベクトル化・並列エンジン。 操作は行ごとではなく、SIMD命令を使ってカラムのブロックに対して実行されます。そして利用可能なすべてのコアに積極的に並列化されます。8コアのノートPCでも違いは分かりますし、64コアのサーバーでは別リーグです。

4. 読み書きの分離。 インサートは新しい「パート」を作り、それはバックグラウンドでマージされます(LSM風アーキテクチャ)。インサートがクエリをブロックせず、クエリがインサートをブロックしません。

知っておくべき主要機能

これはデータシートの完全なリストではなく、プロジェクトの設計を実際に変えるものです。

単一バイナリ、依存関係ゼロ

これは些細なことに聞こえますが、小さなプロジェクトにはおそらく最も重要です。ClickHouseはサーバー、クライアント、ローカルモードを含む単一の実行可能ファイルとして配布されます。JVMも、必須のZooKeeperも、オーケストレータもありません。ファイルを1つダウンロードして実行すれば、分析データベースが手に入ります。

6種類のプロセスを必要とするApache Druidを立ち上げるのと比べてみてください。単独で働くメイカーにとって、この違いがプロジェクトが進むかdocker-compose.ymlで死ぬかを決めます。

clickhouse-local:サーバーなしでファイルにSQL

サーバーを立ち上げたり何かをインポートしたりせずに、CSV、Parquet、JSONをディスクやURLから直接クエリできます:

./clickhouse local --query "
  SELECT country, count() AS visitas
  FROM file('logs.csv', CSVWithNames)
  GROUP BY country
  ORDER BY visitas DESC
  LIMIT 10
"

これは素早い探索のためのpandasスクリプトを置き換え、大きなファイルでは顕著に速いです。

インクリメンタルマテリアライズドビュー

これが私の作り方を最も変えた機能です。ClickHouseのマテリアライズドビューはリフレッシュされるキャッシュではありません:インサートトリガーです。元テーブルにインサートするたびに、そのブロックに対して集計が計算され、宛先テーブルに書き込まれます。

結果として、コストをクエリ時からインサート時に移動させます。ダッシュボードは4億行の生データではなく、4,000行の事前集計テーブルをクエリします。高度なガイドで深く扱いますが、この考え方を覚えておいてください。

本物のJOINを備えた完全なSQLサポート

何年もClickHouseに対する標準的な批判は「JOINが苦手」でした。それはもう成り立ちません。すべての標準JOINタイプをサポートし、カラム統計を使ってJOINを並べ替えるオプティマイザを持ち、標準SQLにはないタイプ(近似した時刻の値で結合するASOF JOINなど。時系列や金融データには純金です)を追加しています。

さらにSQLを何百もの分析関数で拡張します:uniqExactquantileTDigestwindowFunnelsequenceMatch。Postgresなら60行のCTEになるところが、ここでは関数1つです。

70以上のフォーマットとデータレイクとの互換性

Parquet、Iceberg、Delta Lake、Avro、Protobuf、あらゆるバリエーションのJSONの読み書きができます。S3上のファイルをインジェストせずに直接クエリできます。つまり閉じ込められないということです:いつか移行したくなれば、1ステートメントでデータがParquetで出ていきます。

スキーマ爆発なしのJSON

内部的にカラム型で保存するネイティブJSON型で、半構造化データをインジェストできます。完璧なスキーマを事前に設計することなく、形の異なるイベントをインジェストしつつ、カラム型データベースのパフォーマンスを保ちます。

私の意見:ClickHouseが正しい選択のときとそうでないとき

ほとんどのチュートリアルがここであなたを裏切ります。何かを売りたい人が書いているからです。

ClickHouseが良いアイデアなのは:

際限なく成長するイベントテーブルがある(プロダクトアナリティクス、ログ、メトリクス、クリック、IoTテレメトリ)——そしてクエリが時間範囲に対する集計である場合。これが正統なユースケースであり、魔法のように感じられるところです。

ユーザー向けのアナリティクスを構築している:多くの顧客が同時にクエリする、プロダクト内のダッシュボード。ClickHouseはミリ秒のレイテンシで高い同時実行を処理します。それはSnowflakeのようなウェアハウスが高価になる境界です。

BigQueryやSnowflakeの請求書が不安を与える。月30〜60ユーロのClickHouse専用サーバーは、従量制ウェアハウスでは桁違いに高くつくワークロードを支えます。ブートストラップされたプロジェクトにとってこれは最適化ではなく、実現可能か不可能かの差です。

ClickHouseが悪いアイデアなのは:

行ごとの頻繁な更新と削除が必要な場合。ClickHouseはここで大幅に改善しました(軽量ミューテーション、ReplacingMergeTree、軽量削除)が、依然として一度書いて何度も読むために設計されたエンジンです。ワークロードがCRUDなら、Postgresを使いましょう。

マルチテーブルのACIDトランザクションが必要な場合。トランザクションサポートは限定的で、プロジェクトの目標ではありません。注文ステートをここに置かないでください。

数百万行未満の場合。50万行なら、まともなインデックスを付けたPostgresがミリ秒で答えます。ClickHouseを追加するのは利益のない運用複雑さです。小さなデータセットに対する正しい答えは、データベースを変えないことです。

チームが0人ですでに3つのサービスを保守している場合。監視・バックアップ・更新すべきサービスがもう1つ増えます。パフォーマンスの痛みが現実のときにこそ価値があり、予想段階ではありません。

私の実践的なルール:最大のテーブルに対するGROUP BYがPostgresで5秒以上かかり、そのクエリがプロダクトに不可欠なら、ClickHouseを検討する時です。 それより前ではありません。

追加のニュアンス:私に最もうまくいったパターンは、Postgresを置き換えることではなく、両者を並べることです。Postgresはトランザクションの信頼できる情報源(ユーザー、注文、設定)として残し、ClickHouseはCDCやレプリケーションジョブ経由でイベントテーブルのコピーを受け取ります。それぞれが得意なことをやります。

ClickHouseのステップバイステップ・インストール

実務に入りましょう。ニーズに応じて3つの道があります。

オプション1:curlによるクイックインストール(macOS、Linux、FreeBSD)

最も直接的な方法です。システムに合ったバイナリをダウンロードします:

curl https://clickhouse.com/ | sh

LinuxとmacOSでは、これにより~/.local/binclickhousectl(エイリアスchctl)もインストールされます。これは複数のローカルバージョンを管理し、サーバーをバックグラウンドで起動し、ClickHouse Cloudと接続するための公式CLIです。

管理CLIなしでバイナリだけ欲しい場合:

curl https://clickhouse.com/ | CLICKHOUSE_ONLY=1 sh

macOSユーザーへの注記: Gatekeeperがバイナリのデベロッパーを検証できないと文句を言う場合は、システム設定 → プライバシーとセキュリティに進み、実行を承認してください。未署名バイナリに対するmacOSの通常の動作です。

サーバーを起動:

./clickhouse server

別のターミナルでクライアントを:

./clickhouse client

次のようなものが表示されるはずです:

ClickHouse client version 24.5.1.117 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 24.5.1.

local-host :)

データはカレントディレクトリに保存され、サーバーの再起動後も生き残ります。

オプション2:Docker(既にコンテナを使っている場合にお勧め)

プロジェクトにすでにdocker-compose.ymlがある場合の私のデフォルト選択肢です。システムを汚さず、環境を再現可能にするからです。

docker run -d \
  --name clickhouse \
  -p 8123:8123 \
  -p 9000:9000 \
  -v clickhouse_data:/var/lib/clickhouse \
  --ulimit nofile=262144:262144 \
  clickhouse/clickhouse-server

2つのポートは重要で、最初は誰もが混乱します:

  • 8123 はHTTPインターフェースです。ほとんどのWebクライアント、BIツール、curlが使います。
  • 9000 はネイティブTCPプロトコルです。より速くコンパクトで、clickhouse-clientとネイティブドライバが使います。

--ulimit nofileフラグは実質的に必須です:ClickHouseは多くのファイル記述子を開き、上限を上げないと負荷時に奇妙なエラーが出ます。

docker-compose.ymlとして:

services:
  clickhouse:
    image: clickhouse/clickhouse-server
    container_name: clickhouse
    ports:
      - "8123:8123"
      - "9000:9000"
    volumes:
      - clickhouse_data:/var/lib/clickhouse
      - ./config.d:/etc/clickhouse-server/config.d
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    environment:
      CLICKHOUSE_USER: creacosas
      CLICKHOUSE_PASSWORD: cambia_esto
      CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1

volumes:
  clickhouse_data:

コンテナ内のクライアントに接続:

docker exec -it clickhouse clickhouse-client --user creacosas --password cambia_esto

オプション3:何もインストールせずに

構文を試して速度を見たいだけなら、公式プレイグラウンドに実データがロードされており、ブラウザからクエリを実行できます。摩擦ゼロです。

最初のクエリ:ゼロから実データへ

実例に近いものを作ってみましょう:Webサイトのイベントテーブルです。

データベースとテーブルを作る

CREATE DATABASE creacosas;

USE creacosas;

CREATE TABLE eventos
(
    fecha       Date,
    timestamp   DateTime,
    usuario_id  UInt32,
    evento      LowCardinality(String),
    pais        LowCardinality(String),
    url         String,
    duracion_ms UInt32
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(fecha)
ORDER BY (evento, fecha, usuario_id);

ここにはClickHouseの決定である3つの決定があるので、説明に値します:

ENGINE = MergeTree はデフォルトのテーブルエンジンで、90%の場面で使うものです。MergeTreeファミリー全体(ReplacingMergeTreeSummingMergeTreeAggregatingMergeTree)は同じベースを共有し、パートマージに追加の振る舞いを持っています。

ORDER BY はスキーマ全体で最も重要な決定です。ディスク上のデータの物理的順序を定義し、デフォルトではプライマリキーでもあります。ルール:最も多くフィルタする、そしてカーディナリティが低いカラムを先に置く。ここではほぼ常にイベントタイプと日付でフィルタするので、それらが先に来ます。ここを間違えるのが「ClickHouseが遅い」のナンバーワン原因です。

LowCardinality(String) は辞書エンコーディングを適用する型です。カラムが約10,000件未満の個別値(国、イベントタイプ、プラン名)を持つなら、LowCardinalityで包むとストレージが減り、フィルタが目に見えて速くなります。最初はほぼ誰も使わない無料の勝利です。

テストデータを挿入

遊ぶものを持つために、1,000万行の合成データを生成しましょう:

INSERT INTO eventos
SELECT
    toDate('2026-01-01') + (number % 220)                       AS fecha,
    toDateTime(fecha) + (number % 86400)                        AS timestamp,
    (number % 50000) + 1                                        AS usuario_id,
    ['pageview','click','signup','purchase'][(intHash32(number) % 4) + 1]      AS evento,
    ['ES','MX','AR','CO','CL','US'][(intHash32(number + 7) % 6) + 1]           AS pais,
    concat('/pagina/', toString(number % 500))                  AS url,
    (number % 5000) + 100                                       AS duracion_ms
FROM numbers(10000000);

numbers()関数はオンザフライで行を生成します:何もダウンロードせずにClickHouseでテストデータセットを作る標準的な方法です。カテゴリカルカラムにnumber % Nを直接使わずintHash32()を使うのは、2つのカラムが共通の因数を持つモジュロ(例えば4と6)を使うと相関してしまい、結果が人工的に一様になるからです。

クエリ

SELECT
    pais,
    evento,
    count()                         AS total,
    round(avg(duracion_ms))         AS duracion_media,
    uniqExact(usuario_id)           AS usuarios_unicos
FROM eventos
WHERE fecha >= '2026-03-01'
  AND evento = 'purchase'
GROUP BY pais, evento
ORDER BY total DESC;

クライアント出力の最後の行に注目してください。何行処理し、何バイト読み、どんな速度かを教えてくれます:

6 rows in set. Elapsed: 0.021 sec. Processed 1.14 million rows, 8.32 MB (54.28 million rows/s., 396.19 MB/s.)

その数値(合計1,000万行のうち「processed 1.14 million rows」)が重要です。ORDER BY (evento, fecha, ...)のおかげで残り全部をスキップでき、ClickHouseはテーブルの11%しか読みませんでした。ClickHouseの最適化はほぼ常に、この数値を下げることです。

ちょっとしたコツ:ディスク上の実際のサイズを見る

SELECT
    table,
    formatReadableSize(sum(data_compressed_bytes))   AS comprimido,
    formatReadableSize(sum(data_uncompressed_bytes)) AS sin_comprimir,
    round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio
FROM system.columns
WHERE database = 'creacosas'
GROUP BY table;

システムテーブル(system.columnssystem.partssystem.query_log)はClickHouseの最高の機能の一つです:エンジンのイントロスペクションがすべてSQLでクエリ可能です。

あなたが犯すだろう間違い(私も犯しました)

行ごとにインサートする。 ClickHouseは小さなインサートを嫌います。各INSERTはディスクに新しい「パート」を作り、それは後でマージされなければなりません。1,000回の1行インサートは1,000のパートを生み、サーバーはToo many partsエラーで窒息します。少なくとも1,000行、理想的には10,000〜100,000行のバッチでインサートするか、async_insert=1で非同期インサートを有効にしましょう。

デフォルトでNullableを使う。Nullableカラムは余分なマスクカラムを追加し、一部の最適化を無効にします。センチネル値(0、空文字列、1970-01-01)を使えるなら、使いましょう。

高カーディナリティのカラムをORDER BYの先頭に置く。 usuario_idやUUIDを先頭に置くと、圧縮とブロックスキップ能力を破壊します。低カーディナリティを先に、常に。

UPDATEがPostgresのように動くことを期待する。 動きますが、重い操作です。設計が行を絶えず更新することに依存しているなら、設計(あるいはデータベース)を考え直しましょう。

結論

ClickHouseは汎用データベースではありません。そしてそれがまさにその価値です:大規模なボリュームに対する集計という1つのことをほぼ誰よりも上手くやり、それを提供する機能の割に運用負荷は信じられないほど小さくやります。1つのバイナリ、依存関係なし、同じエンジンでノートPCから数百ノードまで動く。

単独で働くメイカーにとって、最後の点が決め手です。VPS上のClickHouseを運用するためにデータチームは不要です。必要なのはORDER BYをよく理解することと、行ごとにインサートしないことです。

Postgresから来て、ダッシュボードが瀕死なら、これに1日過ごしてみてください。最初の学習曲線は週単位ではなく時間単位で、パフォーマンスの飛躍は計測せずとも実感できる種類のものです。

このシリーズの次の記事では、インストール後に来る2つの問いを深く掘り下げます:

  • ClickHouseの代替:完全比較 —— DuckDB、StarRocks、Druid、Pinot、TimescaleDB、クラウドウェアハウス。比較表とユースケースごとの判定付き。
  • ClickHouse高度ガイド —— マテリアライズドビュー、プロジェクション、圧縮コーデック、TTL、S3ティアリング、スロークエリ診断。

よくある質問

ClickHouseは無料ですか?

エンジンはApache 2.0ライセンスのオープンソースで、機能制限やコストなしでセルフホストできます。ClickHouse Cloudは有料のマネージドサービスで、別々のコンピュートとストレージの消費に基づくモデルで、活動がないときはゼロにスケールします。

ClickHouseはPostgreSQLを置き換えられますか?

一般的なケースではありません。異なる作業向けのツールです:トランザクションとアプリケーション状態にはPostgres、分析にはClickHouse。 usual パターンは両方を使い、Postgresを信頼できる情報源とし、ClickHouseがイベントデータを受け取ります。

価値が出るにはどれくらいのデータが必要ですか?

実用的な目安として、イベントテーブルが数千万行を超えると差は明白です。数百万行未満なら、よくインデックスされたPostgresで十分で、運用もシンプルです。

Windowsで動きますか?

はい。DockerまたはWSL2経由で、それが推奨パスです。clickhousectl経由のインストールもあります。

どのテーブルエンジンを使うべきですか?

90%のケースではMergeTree。キーで重複排除する必要があればReplacingMergeTree、集計マテリアライズドビューのターゲットとしてはSummingMergeTreeAggregatingMergeTree

関連記事

興味を持ちそうな関連コンテンツを探し続けましょう

ClickHouseとは:特徴とステップバイステップのインストール(2026年ガイド)