「数千万行のログを集計したいのに、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 run1行で起動できる。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だけ、金額は金額だけ)にまとめて置きます。

この並べ方の違いが効いてきます。たとえば「金額の合計」を出すとき、列指向なら金額の列だけを読めばよく、他の列を一切ディスクから読みません。さらに同じ型の値が連続するため圧縮もよく効きます。これが後半で実測する「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-server を docker run 1行で起動できます。Docker のインストールは sudo apt-get install -y docker.io で済みます。
手順1-1:コンテナを起動する
-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:起動とバージョンを確認する
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 のコンテナで実行したログが以下です。

手順2-1:公式リポジトリを追加してインストールする
$ 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 の標準エンジンで、列指向の圧縮・ソート・インデックスを担う心臓部です。

手順3-1:データベースとテーブルを作る
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:データを入れて集計する
(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ツールを別途入れなくていいのは地味に便利です。

手順4-1:閲覧用ユーザーを作ってアクセスする
Play UI はHTTP経由でログインします。default ユーザーはHTTPからのパスワード認証が必要なので、閲覧用のユーザーを作っておくとスムーズです。
Ok.
linuxlab 🙂 GRANT SELECT ON shop.* TO demo
Ok.
あとはブラウザで Play UI を開き、右上のユーザー欄に demo / パスワード demo1234 を入れて SQL を書きます。実際に1000万行のテーブルに対して国別集計を実行した画面が以下です。

注目してほしいのは 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:カテゴリ別の集計も一瞬で返る
別のクエリ(カテゴリ別の件数・平均)に書き換えて実行しても、同じく一瞬で結果が返ります。

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

結果はClickHouse が 0.071秒、SQLite が 3.336秒。スループットに直すと ClickHouse 1.4億行/秒に対して SQLite 300万行/秒で、約47倍の差がつきました。行数が増えるほどこの差は広がります。
速さだけではありません。同じ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 で実測しました。

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」になる
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」が出る
巨大な GROUP BY や DISTINCT は中間結果をメモリに展開します。メモリの小さい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が基本。LowCardinalityやORDER BYで列指向の最適化が効く - ブラウザ内蔵の Play UI(
:8123/play)で SQL を実行でき、1000万行の集計が0.04秒で返った - 実測で 1000万行の集計が SQLite の約47倍速、ストレージは約1/5。これが列指向OLAPの威力
- ClickHouse はメモリと読込速度が効くので、本番VPSは2〜4GBメモリ・NVMeストレージが目安
まずは自宅PCやWSLの Docker で触ってみて、ログ分析やアクセス解析など「集計が重い」場面で本領を発揮させてみてください。本番でVPSに常駐させる場合のサーバー選びは、下記の比較記事も参考にどうぞ。


コメント