一句话总结
ClickHouse 的安装极其简单--官方提供 Docker 镜像,各平台原生包和二进制文件.
最快的方式是 Docker 一行命令启动 ,然后通过 clickhouse-client 连上去写 SQL. 对 SQL 语法兼容度很高,用过 MySQL 的话上手几乎没有障碍.
Docker 一键启动(推荐)
Docker 是最快,最干净的方式,不会在系统里留下残留文件. 以下命令在 macOS,Linux,Windows 上都可用:
$ docker run -d \ --name ch-server \ -p 8123:8123 \ -p 9000:9000 \ clickhouse/clickhouse-server
一行命令,等镜像拉取完成(首次约 30 秒),服务就启动了.验证一下:
$ docker ps --filter name=ch-server $ docker exec -it ch-server clickhouse-client
如果看到 ClickHouse client version ... 和一个 :) 提示符,说明已经进入了 ClickHouse 的交互式客户端. 试试第一条命令:
SELECT 1 Query id: a1b2c3d4-... ┌─1─┐ 1. │ 1 │ └───┘ 1 row in set. Elapsed: 0.002 sec.
这条查询没有查任何表,只是在验证:服务端的连接,解析,执行,返回这一整条链路是通的 .这就够了,接下来正式动手.
Docker 常用管理命令
docker stop ch-server停止服务 docker start ch-server重新启动 docker rm -f ch-server删除容器(数据会丢失,除非挂载了 volume) docker exec -it ch-server bash进入容器的 shell
其他安装方式
如果不想用 Docker,官方也提供了各平台的原生安装包:
macOS(Homebrew)
$ brew install clickhouse $ clickhouse server $ clickhouse client
Linux(Debian/Ubuntu)
$ 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 /etc/apt/keyrings/clickhouse.gpg $ echo "deb [signed-by=/etc/apt/keyrings/clickhouse.gpg] \ https://packages.clickhouse.com/deb stable main" \ | sudo tee /etc/apt/sources.list.d/clickhouse.list $ sudo apt-get update $ sudo apt-get install -y clickhouse-server clickhouse-client $ sudo service clickhouse-server start
Linux(RHEL/CentOS)
$ sudo yum install -y yum-utils $ sudo yum-config-manager --add-repo \ https://packages.clickhouse.com/rpm/clickhouse.repo $ sudo yum install -y clickhouse-server clickhouse-client $ sudo service clickhouse-server start
本篇后续用 Docker 方式 演示,进入客户端的方式统一为:
$ docker exec -it ch-server clickhouse-client
连接到 ClickHouse
ClickHouse 提供两种通信协议,各自对应一个端口:
协议
默认端口
用途
客户端
Native TCP
9000
高性能二进制协议,生产环境首选
clickhouse-client,各语言原生驱动
HTTP
8123
RESTful 接口,方便调试和轻量集成
curl,浏览器,任何 HTTP 客户端
clickhouse-client 默认连本机 9000 端口.如果要连远程服务器:
$ clickhouse-client --host 192.168.1.100 --port 9000 --user default --password yourpass $ clickhouse-client --query "SELECT count() FROM mydb.orders"
进入客户端后,先看看环境:
┌─name───────────────┐ 1. │ INFORMATION_SCHEMA │ 2. │ default │ 3. │ information_schema │ 4. │ system │ └────────────────────┘
和 MySQL 的体验几乎一样--SHOW DATABASES,SHOW TABLES,DESCRIBE table 这些命令全都可以用,这是 ClickHouse 刻意做的兼容设计.
第一个数据库和表
创建一个练习用的数据库,然后建一张"电商订单"表--后续的查询都在这张表上操作:
CREATE DATABASE IF NOT EXISTS learn;
CREATE TABLE orders ( order_id UInt64, customer_id UInt64, product String, category String, amount Decimal (10 , 2 ), quantity UInt8, status Enum8('pending' = 1 , 'paid' = 2 , 'shipped' = 3 , 'cancelled' = 4 ), created_at DateTime ) ENGINE = MergeTree()ORDER BY (created_at, order_id);
这条建表语句值得逐行看一下,因为有几个 ClickHouse 特有的要素:
行
说明
UInt64, UInt8
无符号整数.ClickHouse 类型系统精确到位宽,没有 INT 这种模糊类型.
Decimal(10, 2)
定点小数,适合金额.不用 FLOAT 避免精度问题.
Enum8(...)
枚举类型.存的是 1 字节的整数,查出来是 'paid' 这样的字符串.既省空间又可读.
DateTime
精确到秒的日期时间.不做时区转换,原文存储.
ENGINE = MergeTree()
这是 ClickHouse 最核心的表引擎 .MergeTree 家族是 ClickHouse 高性能的基石,后续进阶篇会深入.现在先记住:建表必选引擎.
ORDER BY (created_at, order_id)
排序键(Sorting Key).数据在磁盘上按这个顺序排列,直接影响查询效率.时间列放第一位是经典选择.
表引擎 = MySQL 中的存储引擎(InnoDB/MyISAM),但选择更多,代价更大.
MySQL 建表时 ENGINE=InnoDB 几乎不需要思考,但 ClickHouse 的引擎决定了数据的存储方式,是否支持副本,是否自动聚合. 现阶段认准 MergeTree 及其变体即可,后面会专门讲引擎选择.
验证一下表结构:
┌─name────────┬─type──────────┬─default_type─┬─default_expression─┐ 1. │ order_id │ UInt64 │ │ │ 2. │ customer_id │ UInt64 │ │ │ 3. │ product │ String │ │ │ 4. │ category │ String │ │ │ 5. │ amount │ Decimal(10,2) │ │ │ 6. │ quantity │ UInt8 │ │ │ 7. │ status │ Enum8(...) │ │ │ 8. │ created_at │ DateTime │ │ │ └─────────────┴───────────────┴──────────────┴────────────────────┘
写入第一批数据
ClickHouse 的 INSERT 语法和标准 SQL 一致,写入一批模拟数据:
INSERT INTO orders VALUES (1 , 101 , 'iPhone 16' , '数码' , 6999.00 , 1 , 'paid' , '2025-01-15 10:30:00' ), (2 , 102 , 'AirPods Pro' , '数码' , 1899.00 , 2 , 'paid' , '2025-01-15 11:00:00' ), (3 , 101 , 'MacBook Pro' , '数码' , 14999.00 , 1 , 'shipped' ,'2025-01-16 09:00:00' ), (4 , 103 , '瑜伽垫' , '运动' , 129.00 , 1 , 'paid' , '2025-01-16 14:00:00' ), (5 , 102 , '蛋白粉' , '运动' , 299.00 , 3 , 'paid' , '2025-01-17 08:00:00' ), (6 , 104 , '键盘' , '数码' , 599.00 , 1 , 'cancelled' ,'2025-01-17 16:00:00' ), (7 , 101 , '数据线' , '数码' , 39.00 , 5 , 'shipped' , '2025-01-18 10:00:00' ), (8 , 105 , '跑鞋' , '运动' , 899.00 , 1 , 'paid' , '2025-01-18 12:00:00' ), (9 , 103 , '运动手环' , '数码' , 349.00 , 1 , 'paid' , '2025-01-19 09:00:00' ), (10 , 102 ,'瑜伽裤' , '运动' , 199.00 , 1 , 'paid' , '2025-01-19 15:00:00' );
确认数据写入成功:
SELECT count () FROM orders;
┌─count()─┐ 1. │ 10 │ └─────────┘
小细节
ClickHouse 习惯用 count() 而非 COUNT(*),两者等效,但 count() 更简洁. ClickHouse 的函数名大多用小写驼峰或全小写,不过标准大写的 COUNT(*),SUM() 也完全支持.
体验分析查询
10 行数据看不出 ClickHouse 的性能优势,但足以展示分析类 SQL 的写法 --这些就是 ClickHouse 最擅长的查询模式:
聚合:各品类销售概况
SELECT category, count () AS order_cnt, sum (amount) AS total_revenue, round(avg (amount), 2 ) AS avg_order_valueFROM ordersWHERE status != 'cancelled' GROUP BY categoryORDER BY total_revenue DESC ;
┌─category─┬─order_cnt─┬─total_revenue─┬─avg_order_value─┐ 1. │ 数码 │ 5 │ 22285.00 │ 4457.00 │ 2. │ 运动 │ 4 │ 1526.00 │ 381.50 │ └──────────┴───────────┴───────────────┴─────────────────┘
时间维度:每日订单量
SELECT toDate(created_at) AS day , count () AS orders, sum (amount) AS revenueFROM ordersGROUP BY day ORDER BY day ;
┌────────day─┬─orders─┬─revenue─┐ 1. │ 2025-01-15 │ 2 │ 8898.00 │ 2. │ 2025-01-16 │ 2 │ 15128.00│ 3. │ 2025-01-17 │ 2 │ 898.00 │ 4. │ 2025-01-18 │ 2 │ 938.00 │ 5. │ 2025-01-19 │ 2 │ 548.00 │ └────────────┴────────┴─────────┘
toDate() 是 ClickHouse 内置的日期转换函数,把 DateTime 截断到天.这类时间函数非常丰富--toStartOfHour(),toStartOfWeek(),toYYYYMM() 等,是日常分析的高频工具.
Top-N:消费最高的客户
SELECT customer_id, count () AS orders, sum (amount) AS total_spentFROM ordersWHERE status = 'paid' GROUP BY customer_idORDER BY total_spent DESC LIMIT 3 ;
┌─customer_id─┬─orders─┬─total_spent─┐ 1. │ 101 │ 3 │ 7037.00 │ 2. │ 102 │ 2 │ 2198.00 │ 3. │ 103 │ 1 │ 129.00 │ └─────────────┴────────┴─────────────┘
条件过滤:枚举列的使用
SELECT status, count () AS cnt, round(count () * 100.0 / (SELECT count () FROM orders), 1 ) AS pctFROM ordersGROUP BY statusORDER BY cnt DESC ;
┌─status────┬─cnt─┬──pct─┐ 1. │ paid │ 7 │ 70.0 │ 2. │ shipped │ 2 │ 20.0 │ 3. │ cancelled │ 1 │ 10.0 │ └───────────┴─────┴──────┘
注意:Enum8 列在查询结果中自动显示为人类可读的字符串('paid'),但存储时只占 1 字节.这是 ClickHouse 在可读性和存储效率之间的巧妙平衡.
一个 ClickHouse 风味查询
ClickHouse 内建了大量聚合函数,下面这条查询展示几个有代表性的:
SELECT category, groupArray(product) AS products, sum (amount * quantity) AS total_revenue, avg (amount) AS avg_price, max (amount) - min (amount) AS price_range FROM ordersWHERE status != 'cancelled' GROUP BY category;
┌─category─┬─products──────────────────────────┬─total_revenue─┬─avg_price─┬─price_range─┐ 1. │ 数码 │ ['iPhone 16','AirPods Pro',...] │ 22375.00 │ 4457.00 │ 14960.00 │ 2. │ 运动 │ ['瑜伽垫','蛋白粉','跑鞋','瑜伽裤']│ 1826.00 │ 381.50 │ 770.00 │ └──────────┴───────────────────────────────────┴───────────────┴───────────┴─────────────┘
groupArray 是 ClickHouse 的特色函数--把每个分组内的值收集成一个数组.这在 OLAP 场景下非常实用:比如查询"每个用户最近 10 次购买的商品",用标准 SQL 要用窗口函数绕一圈,ClickHouse 直接一个 groupArray 配合数组函数就解决了.
HTTP 接口速览
除了 clickhouse-client,ClickHouse 的 HTTP 接口同样可用,调试和轻量集成时很方便:
$ curl -s 'http://localhost:8123/?query=SELECT%20count()%20FROM%20learn.orders' $ curl -s 'http://localhost:8123/?query=SELECT%20*%20FROM%20learn.orders%20LIMIT%203&default_format=JSONEachRow'
也可以直接在浏览器打开 http://localhost:8123/play,ClickHouse 内置了一个简易的 Web UI 查询界面,适合快速验证.
本篇要点
安装零门槛 : Docker 一行命令启动,docker exec -it ch-server clickhouse-client 进入客户端.
两种协议 : Native TCP(9000,高性能二进制)和 HTTP(8123,RESTful 调试),各自有适用场景.
建表核心要素 : 精确的类型系统(UInt8/Decimal/Enum8),ENGINE = MergeTree()(必选),ORDER BY 决定数据的物理排列.
SQL 兼容度高 : SELECT/WHERE/GROUP BY/ORDER BY/LIMIT 和标准 SQL 一致,count() 比 COUNT(*) 更常见.
ClickHouse 特色函数 : toDate() 等时间转换,groupArray() 等聚合函数,日常分析的高频工具.
动手练习
Docker 启动 -- 用 Docker 启动 ClickHouse,进入客户端
建库建表 -- 创建 learn 库和 orders 表,插入模拟数据
聚合查询 -- 分别按品类,日期,客户维度做聚合查询
HTTP 接口 -- 用 curl 或浏览器执行同一条查询
探索系统表 -- SELECT * FROM system.tables WHERE database = 'learn';
下一站
现在已经有了一个运行中的 ClickHouse 和第一张表. 后续的 03 - 表引擎入门会展开讲 MergeTree 家族和其他引擎类型,建立"选引擎"的决策框架.