🖱️

ClickHouse入門

に公開

ClickHouseとは?

ClickHouseは、オープンソースの列指向分析データベースです。

https://clickhouse.com/

分析データレポートをリアルタイムに生成できるのが大きな特徴です。

主な特徴

  • オンライン分析処理 (OLAP) を行う設計
  • 列指向 SQL データベース管理システム (DBMS)
  • クラウド提供もしている
  • トランザクショナルクエリがクエリごとに数行しか読み書きしない
  • 列指向ストレージ
    • 一般的な行指向と異なり、列単位での集計やフィルタが高速!!

ローカル環境構築

Dockerイメージが存在するため、Dockerで起動が可能です。

https://hub.docker.com/_/clickhouse

サーバー起動

docker run -d -p 8123:8123 --name clickhouse-server clickhouse

クライアントへアクセス

docker exec -it clickhouse-server sh
# 以下のコマンドでクライアント起動
clickhouse-client

接続できたのでクエリを発行してみます。

SELECT version()

Query id: cfe5aac5-3a7e-4b96-8aa7-2ccc2bf7c6a3

   ┌─version()───┐
1. │ 25.7.1.3997
   └─────────────┘

1 row in set. Elapsed: 0.006 sec.

データベースとテーブル操作

以下のクエリでデータベースの作成をします。

CREATE DATABASE sample;

では、テーブルも作成してみましょう!

# DB切り替え
USE sample;

CREATE TABLE users
(
    `id` UInt32,
    `name` String
)
ENGINE = MergeTree
PRIMARY KEY id;

データベース一覧、テーブル一覧は以下のクエリで確認できました。(互換があるらしい)

# MySQLと同じコマンド
SHOW DATABASES;
SHOW TABLES;

# PostgreSQLと同じコマンド
\l
\d

テーブル構造の確認は以下のクエリで行えます。

DESCRIBE TABLE users

Query id: a870c917-c449-4f02-8a40-c7a51882f4f3

   ┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
1. │ id   │ UInt32 │              │                    │         │                  │                │
2. │ name │ String │              │                    │         │                  │                │
   └──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

2 rows in set. Elapsed: 0.004 sec.

CRUD操作も行ってみます。

# INSERT
INSERT INTO users VALUES (1, 'test');

# SELECT
SELECT * FROM users;
# UPDATE
UPDATE users SET name = 'test test' WHERE id = 1

Query id: 4f4cd777-fd25-45b9-946a-888085f2eb2b


Elapsed: 0.006 sec. 

Received exception from server (version 25.7.1):
Code: 344. DB::Exception: Received from localhost:9000. DB::Exception: Lightweight updates are not allowed. Set 'allow_experimental_lightweight_update = 1' to allow them. (SUPPORT_IS_DISABLED)

列指向データベースのため、1行に対する更新はデフォルトではできないようになっています。
(制限解除は可能だが、実験的な機能)

分析として使うことが多いと思うので、基本的には「更新」ではなく「追加」する形で対応するのが良さそうです。

更新が必要な場合、パーティション単位で置換する、テーブルごと置換するような対応が良さそうです。

削除については普通に行えました。

# DELETE
 DELETE from users WHERE id = 1;

クエリについては多くの場合、ANSI SQL標準と同一のSQLをサポートしているらしいです。
(多くの場合というワードが引っかかりますが)

Indexについて

従来のRDBとはIndexの考え方が異なるので、Indexについても記載します。

ClickHouseは列指向のため、データが列ごとにソート・圧縮されて各カラムごとに別々のファイルに格納されます。

Indexは以下の種類があります。

  • Primary Key: 主キー
  • MinMax: 数値範囲での絞り込み
  • Set: カーディナリティが低い列向け
  • Bloom Filter: 存在チェック向け
  • N-gram: 部分文字列検索、LIKE演算向け

より詳細なことは公式ドキュメントを参照してみてください。

https://clickhouse.com/docs/optimize/skipping-indexes

Engineについて

テーブルエンジン(テーブルの種類)によって性質が異なるため、Engineについても記載します。

テーブルエンジンによって以下の内容が異なります。

  • データの保存場所、書き込む場所、読み取る場所
  • サポートされるクエリ
  • 同時データアクセス
  • データが存在する場合のindex使用
  • マルチスレッドリクエストの可否
  • データレプリケーションパラメータ

以下、エンジンの種類です。

MergeTree

高負荷タスクに対する最も汎用的なエンジンです。
迅速なデータ挿入と、バックグランドでのデータ処理が特徴です。

MergeTree以外にもMergeTreeを拡張したエンジンが複数存在します。

https://clickhouse.com/docs/engines/table-engines#engine-families

Log

最小限の機能を持つ軽量エンジンです。
約100万件までを迅速に書き込み、あとで全体として読み取る必要がある場合に効果的です。

Logも同じく拡張したエンジンが複数存在します。

https://clickhouse.com/docs/engines/table-engines#log

総合エンジン

他のデータストレージや処理システムと通信するためのエンジンです。

ODBC、JDBC、MySQL、PostgreSQL、Redisなどが存在します。

https://clickhouse.com/docs/engines/table-engines#integration-engines

最後に

今回は入門なのでかなり浅い内容ですが、実務で使えるレベルまでキャッチアップ続けます。

Discussion