ClickHouse on Ubuntu — 超高速列指向OLAPデータベースの構築

データエンジニアリング

「数千万行のログを集計したいのに、MySQL や PostgreSQL だと数十秒〜数分かかってしまう」——そんな悩みを列指向(カラムナ)OLAPデータベースの ClickHouse が解決します。結論から言うと、Ubuntu で ClickHouse を立てれば、1000万行の GROUP BY 集計が0.07秒で返ってきます。

本記事では Ubuntu 24.04 LTS に ClickHouse を Docker と apt の両方で構築し、実際に1000万行を投入して集計速度・ストレージ消費を計測しました。さらに同じ1000万行を SQLite(行指向)にも入れて、どれだけ差がつくかを実測しています。

ClickHouse はブラウザだけで SQL を実行できる Play UI を内蔵しているので、その画面も実際に撮影して載せています。「コマンドの結果が本当にこうなるのか」を全部確かめた、実データ中心の記事です。

この記事のポイント

  • ClickHouse は docker run 1行で起動できる。HTTPは8123・ネイティブは9000ポート
  • 実測: 1000万行の GROUP BY 集計が ClickHouse 0.07秒 vs SQLite 3.34秒(約47倍速
  • 実測: 同じ1000万行のストレージが ClickHouse 45 MiB vs SQLite 250 MB(列指向の圧縮で約1/5)
  • ブラウザ内蔵の Play UI(http://localhost:8123/play)で SQL を実行できる
  • Ubuntu 24.04 への apt インストールで入ったのは clickhouse-server 26.5.2.39(2026-06-14時点)

ClickHouseとは:分析クエリに全振りした列指向データベース

ClickHouse は、大量の行をまとめて集計・分析する用途(OLAP:オンライン分析処理)に特化したオープンソースのデータベースです。MySQL や PostgreSQL のような行指向のDBが「1件ずつの登録・更新(OLTP)」を得意とするのに対し、ClickHouse は「数千万〜数十億行をスキャンして集計する」ことに全振りしています。

速さの秘密は列指向(カラムナ)ストレージです。行指向のDBは1行ぶんのデータ(id, 名前, 金額…)をまとめてディスクに置きますが、列指向のDBは列ごと(idはidだけ、金額は金額だけ)にまとめて置きます。

行指向DBと列指向DBのデータの並べ方(概念図)
行指向DBと列指向DBのデータの並べ方(概念図)

この並べ方の違いが効いてきます。たとえば「金額の合計」を出すとき、列指向なら金額の列だけを読めばよく、他の列を一切ディスクから読みません。さらに同じ型の値が連続するため圧縮もよく効きます。これが後半で実測する「47倍速」「1/5のストレージ」の正体です。

動作確認済み環境

項目 環境・バージョン
ホストOS Ubuntu 24.04.4 LTS(Noble Numbat)
ClickHouse(Docker) 26.5.1.882(clickhouse/clickhouse-server:latest、ベースは Ubuntu 22.04.5)
ClickHouse(apt) 26.5.2.39(packages.clickhouse.com/deb stable main
比較対象 SQLite 3.45.1(同一Linux環境・同一データ)
アクセスポート 8123/tcp(HTTP・Play UI)、9000/tcp(ネイティブ)
確認日 2026-06-14

注意

ClickHouse はメモリをよく使います。集計は中間結果をRAMに展開するため、本番では最低でも 2GB、できれば 4GB 以上のメモリを推奨します。1GBのVPSでも起動はしますが、大きな集計でメモリ不足になることがあります。

手順1:Docker で ClickHouse を起動する(最短ルート)

まず試すだけなら Docker が一番手軽です。公式イメージ clickhouse/clickhouse-serverdocker run 1行で起動できます。Docker のインストールは sudo apt-get install -y docker.io で済みます。

手順1-1:コンテナを起動する




ubuntu@vps: ~
$ docker run -d –name clickhouse-server \
-p 8123:8123 -p 9000:9000 \
–ulimit nofile=262144:262144 \
clickhouse/clickhouse-server
Unable to find image ‘clickhouse/clickhouse-server:latest’ locally
latest: Pulling from clickhouse/clickhouse-server
Status: Downloaded newer image for clickhouse/clickhouse-server:latest
601cf6ecaee095c1299df7f797368d1eb84fc5e93b20ce431b3bdad48a6a11d9

--ulimit nofile=262144:262144 はファイルディスクリプタの上限を上げる指定です。ClickHouse は多数のファイルを同時に開くので、これを付けないと起動時に警告が出ます。付けておくのが定番です。

手順1-2:起動とバージョンを確認する




ubuntu@vps: ~
$ curl http://localhost:8123/ping
Ok.
$ docker exec -it clickhouse-server clickhouse-client –query “SELECT version()”
26.5.1.882

Ok. が返ってくればHTTPインターフェイス(8123番)が生きています。SELECT version() でサーバーのバージョン(実測では 26.5.1.882)が確認できます。

手順2:apt で Ubuntu に直接インストールする

VPSやサーバーに常駐させるなら、Docker ではなく apt で OS に直接入れる構成も定番です。ClickHouse は公式の apt リポジトリを提供しています。実際に Ubuntu 24.04 のコンテナで実行したログが以下です。

ClickHouse 公式aptリポジトリからのインストール実ログ(Ubuntu 24.04 実測)
ClickHouse 公式aptリポジトリからのインストール実ログ(Ubuntu 24.04 実測)

手順2-1:公式リポジトリを追加してインストールする




ubuntu@vps: ~
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
$ curl -fsSL https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key \
| sudo gpg –dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
$ ARCH=$(dpkg –print-architecture)
$ echo “deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] \
https://packages.clickhouse.com/deb stable main” \
| sudo tee /etc/apt/sources.list.d/clickhouse.list
$ sudo apt-get update
$ apt-cache policy clickhouse-server
clickhouse-server:
Candidate: 26.5.2.39
$ sudo apt-get install -y clickhouse-server clickhouse-client
Setting up clickhouse-server (26.5.2.39) …
$ clickhouse-server –version
ClickHouse server version 26.5.2.39 (official build).

apt リポジトリの最新版(実測時点で 26.5.2.39)が入ります。インストール後は sudo systemctl enable --now clickhouse-server でサービスとして常駐できます。systemd(Linuxのサービス管理の仕組み)に登録されるので、再起動後も自動で立ち上がります。

インストール中にパスワードを聞かれます

apt インストールの途中で、default ユーザーのパスワード設定を求められます。空のままEnterでも進められますが、外部公開するサーバーでは必ずパスワードを設定してください。あとから /etc/clickhouse-server/users.d/ に設定ファイルを置いて変更することもできます。

手順3:clickhouse-client でテーブル作成から集計まで

ClickHouse に付属する CLI クライアント clickhouse-client で、テーブルを作って集計するところまでを実際にやってみます。ポイントは ENGINE = MergeTree の部分です。MergeTree は ClickHouse の標準エンジンで、列指向の圧縮・ソート・インデックスを担う心臓部です。

clickhouse-clientでテーブル作成〜集計までを実行(実測セッション)
clickhouse-clientでテーブル作成〜集計までを実行(実測セッション)

手順3-1:データベースとテーブルを作る




linuxlab 🙂 clickhouse-client
linuxlab 🙂 CREATE DATABASE shop
Ok. 0 rows in set. Elapsed: 0.007 sec.
linuxlab 🙂 CREATE TABLE shop.orders (
order_id UInt32,
ordered_at DateTime,
country LowCardinality(String),
amount Decimal(10,2)
) ENGINE = MergeTree ORDER BY (country, ordered_at)
Ok. 0 rows in set. Elapsed: 0.006 sec.

型に LowCardinality(String) を使っているのがポイントです。これは「種類が少ない文字列(国コード・カテゴリ名など)」を辞書圧縮する型で、ClickHouse ならではの最適化です。ORDER BY (country, ordered_at) はMergeTreeの主キー(並び順)で、この順でデータがソート保存されます。

手順3-2:データを入れて集計する




linuxlab 🙂 clickhouse-client
linuxlab 🙂 INSERT INTO shop.orders VALUES
(1,’2026-06-14 09:00:00′,’JP’,1980.00),(2,’2026-06-14 09:05:00′,’US’,49.99),
(3,’2026-06-14 09:11:00′,’JP’,780.00), … (6,’2026-06-14 11:15:00′,’JP’,330.00)
Ok. 6 rows in set. Elapsed: 0.063 sec.
linuxlab 🙂 SELECT country, count() AS orders, sum(amount) AS total,
round(avg(amount),2) AS avg
FROM shop.orders GROUP BY country ORDER BY total DESC
┌─country─┬─orders─┬───total─┬───avg─┐
1. │ JP │ 3 │ 3090 │ 1030 │
2. │ US │ 2 │ 1249.99 │ 625 │
3. │ DE │ 1 │ 129.5 │ 129.5 │
└─────────┴────────┴─────────┴───────┘
3 rows in set. Elapsed: 0.004 sec.

結果が罫線付きの見やすい表で返ってきます。clickhouse-client はデフォルトでこの PrettyCompact フォーマットを使うので、ターミナルでもそのまま読めます。ここまでは普通のSQLとほぼ同じ感覚で書けることが分かります。

手順4:ブラウザの Play UI で SQL を実行する

ClickHouse には追加インストール不要のブラウザUI「Play」が内蔵されています。http://localhost:8123/play(VPSなら http://サーバーIP:8123/play)を開くだけで、ブラウザから SQL を書いて実行できます。GUIツールを別途入れなくていいのは地味に便利です。

ClickHouse内蔵 Play UI のSQL入力画面(実際の画面)
ClickHouse内蔵 Play UI のSQL入力画面(実際の画面)

手順4-1:閲覧用ユーザーを作ってアクセスする

Play UI はHTTP経由でログインします。default ユーザーはHTTPからのパスワード認証が必要なので、閲覧用のユーザーを作っておくとスムーズです。




linuxlab 🙂 clickhouse-client
linuxlab 🙂 CREATE USER demo IDENTIFIED BY ‘demo1234’ DEFAULT DATABASE shop
Ok.
linuxlab 🙂 GRANT SELECT ON shop.* TO demo
Ok.

あとはブラウザで Play UI を開き、右上のユーザー欄に demo / パスワード demo1234 を入れて SQL を書きます。実際に1000万行のテーブルに対して国別集計を実行した画面が以下です。

Play UIで1000万行を国別集計した結果画面(実際の画面・0.04秒で完了)
Play UIで1000万行を国別集計した結果画面(実際の画面・0.04秒で完了)

注目してほしいのは Run ボタンの右に出る統計です。実際の画面には 「5 rows in result, 0.04 sec. Read 10.00 million rows, 90.00 MB (224.96 million/sec, 2.02 GB/sec)」と表示されています。1000万行・90MBを0.04秒で読み切っている、つまり毎秒2GB超でスキャンしているということです。

手順4-2:カテゴリ別の集計も一瞬で返る

別のクエリ(カテゴリ別の件数・平均)に書き換えて実行しても、同じく一瞬で結果が返ります。

Play UIでカテゴリ別に集計した結果画面(実際の画面)
Play UIでカテゴリ別に集計した結果画面(実際の画面)
著者アイコン
著者アイコン

正直、初めて Play UI で1000万行の集計が一瞬で返ってきたときは「えっ、もう終わったの?」と二度押ししてしまいました。MySQL で同じことをやると待たされるのに慣れていると、この速さはちょっと感動します。

列指向はどれだけ速いのか:1000万行ベンチ

ここからが本題です。同じ1000万行・同じ集計クエリを ClickHouse(列指向)と SQLite(行指向)の両方で実行し、同一のLinux環境(Docker)で計測しました。クエリは「カテゴリ別に件数・平均・合計を出す GROUP BY」で、各3回実行した平均です。

1000万行のGROUP BY集計スループット ClickHouse vs SQLite(実測)
1000万行のGROUP BY集計スループット ClickHouse vs SQLite(実測)

結果はClickHouse が 0.071秒、SQLite が 3.336秒。スループットに直すと ClickHouse 1.4億行/秒に対して SQLite 300万行/秒で、約47倍の差がつきました。行数が増えるほどこの差は広がります。

速さだけではありません。同じ1000万行を保存したときのディスク消費も大きく違いました。

同一1000万行のストレージ消費と集計速度(実測)
同一1000万行のストレージ消費と集計速度(実測)
項目 ClickHouse(列指向) SQLite(行指向)
集計クエリ(3回平均) 0.071 秒 3.336 秒
スループット 約 1.4億 行/秒 約 300万 行/秒
ストレージ(同一1000万行) 45 MiB(圧縮後) 250 MB
データの並べ方 列ごと(必要な列だけ走査) 行ごと(全列を読み込む)

ClickHouse は内部の system.columns で確認すると、非圧縮 162 MiB のデータを 45 MiB まで圧縮(約3.6倍)していました。SQLite のDBファイルは 250MB だったので、ディスク消費は実に 約1/5 です。列指向は同じ型の値が連続するため、圧縮がよく効くわけです。

フェアな比較のための補足

SQLite は本来「1件ずつの読み書き」が得意な軽量DBで、大量集計用に作られていません。この比較は「列指向OLAPと行指向では、集計でこれだけ構造的に差が出る」ことを示すためのものです。逆に、1行だけをキー検索する用途では SQLite や MySQL の方が向いています。用途が違うという点は押さえておいてください。

ClickHouse を動かすマシンの目安

ClickHouse の集計はマルチスレッドでCPUを使い切り、データをメモリに展開します。つまりCPUのコア数・メモリ帯域・ディスクの読込速度がそのまま速度に効きます。検証に使った環境の基礎性能を sysbench と dd で実測しました。

ClickHouseを動かしたホストの基礎性能(実測)
ClickHouseを動かしたホストの基礎性能(実測)

CPUは sysbench で 14,199 events/sec(3回平均)、メモリ帯域は 5,456 MiB/sec、ディスクは direct I/O で書込 949 MB/s・読込 3.2 GB/s でした。MergeTree は読込が支配的なので、読込の速いSSD/NVMeほど集計が速くなります。VPSを選ぶ際は、CPUコア数とストレージの種類(NVMe対応か)を見ると失敗しにくいです。

「自宅PCで試して、本番はVPSに置きたい」という場合、まずは2〜4GBメモリのプランから始めるのが現実的です。

よくあるエラーと解決策

① Play UI で「Authentication failed」になる




browser: Play UI
Code: 194. DB::Exception: default: Authentication failed:
password is incorrect, or there is no user with such name

HTTP経由では default ユーザーがパスワードを要求します。手順4で作った demo のような閲覧用ユーザーを使うか、default にパスワードを設定して、Play UI右上のユーザー/パスワード欄に入力してください。

② コンテナは起動するのにブラウザで開けない(VPSの場合)

VultrやDigitalOceanなどのVPSはデフォルトでポートが閉じています。sudo ufw allow 8123 で8123番を開放してください。ただし8123を全世界に公開するのは危険なので、SSHポートフォワード(ssh -L 8123:localhost:8123 user@サーバーIP)でローカルからだけ繋ぐ方が安全です。

③ 大きな集計で「Memory limit exceeded」が出る




ubuntu@vps: ~
DB::Exception: Memory limit (total) exceeded

巨大な GROUP BYDISTINCT は中間結果をメモリに展開します。メモリの小さいVPSで起きやすいエラーです。対処は、ディスクにあふれさせる設定(SET max_bytes_before_external_group_by)を使うか、素直にメモリの大きいプランに上げることです。ClickHouse は2GB未満だと窮屈に感じる場面が増えます。

④ docker run 時に「nofile」の警告が出る

ファイルディスクリプタ上限の警告です。手順1のように --ulimit nofile=262144:262144 を付ければ消えます。動作自体には影響しませんが、本番では付けておきましょう。

まとめ

ClickHouse を Ubuntu に構築して実測した結果をまとめます。

  • Docker なら docker run -d -p 8123:8123 -p 9000:9000 --ulimit nofile=262144:262144 clickhouse/clickhouse-server の1行で起動できる
  • apt なら公式リポジトリを追加して apt-get install clickhouse-server clickhouse-client(実測で 26.5.2.39 が入った)
  • テーブルは ENGINE = MergeTree が基本。LowCardinalityORDER BY で列指向の最適化が効く
  • ブラウザ内蔵の Play UI(:8123/play)で SQL を実行でき、1000万行の集計が0.04秒で返った
  • 実測で 1000万行の集計が SQLite の約47倍速、ストレージは約1/5。これが列指向OLAPの威力
  • ClickHouse はメモリと読込速度が効くので、本番VPSは2〜4GBメモリ・NVMeストレージが目安

まずは自宅PCやWSLの Docker で触ってみて、ログ分析やアクセス解析など「集計が重い」場面で本領を発揮させてみてください。本番でVPSに常駐させる場合のサーバー選びは、下記の比較記事も参考にどうぞ。

コメント

タイトルとURLをコピーしました