文章目录
在线体验平台
https://play.clickhouse.com/play?user=play
show databases
show tables from <database>
select * from <database>.<table>
概念
https://clickhouse.com/docs/zh/getting-started/tutorial
列式数据库
OLAP离线数据处理
数据库
表
列、列数据类型
引擎
库引擎
- atomic
默认 - mysql
相当于代理访问mysql
表引擎
合并树
高负载,通用,功能强大
*** MergeTree
存储的数据按主键排序。
可以使用分区
支持数据副本
支持数据采样
ReplacingMergeTree
在MergeTree基础上 会去重,删除排序值的重复项 (只保证最终一致,非强一致)
日志
轻量、最小功能、没有索引
TinyLog
集成引擎
集成其他数据库的访问。
特定功能
- 分布式
存储原理
表=目录
列=文件
数据复制
system.processes表
包含有当前正在处理的请求列表
数据类型
https://clickhouse.com/docs/zh/sql-reference/data-types
部署
单机性能不差(占用cpu资源多、建议单机单应用)
集群部署简单
- k8s单机部署参考
https://blog.csdn.net/xyc1211/article/details/131814602
安装验证
$ curl 'http://localhost:8123/'
Ok.
$ curl 'http://localhost:8123/ping'
Ok.
$ curl 'http://localhost:8123/replicas_status'
Ok.
集群
集群部署,主要支持 数据副本与分布式表
- 采用zookeeper作为集群协调
数据副本
每种表引擎都有它的 Replcated引擎
副本是表级别的
一份数据可配置多个副本
没有主从关系
步骤:
- 集群部署ck,zk配置集群
- 每个节点都 创建表 用Replcated引擎(声明zk路径、备份名称)
- 任意节点写入数据,zk后台自动同步
- 所以节点都能查询
分布式表
水平切分表,存储在不同节点
分布式会降低查询速度,增加管理成本
Distributed引擎:相当于分片代理。不存储数据,转发请求,组装数据
步骤
- 配置集群,集群下n个分片shard,分片下n个副本replica 的ip端口
- 创建 分片表 【ON CLUSTER】,每个节点都会有表
- 创建 分布式表 Distributed引擎(本地分片表名,分片键)
- 通过分布式表插入数据,会自动根据分片键映射 插入对应节点的分片表
- 通过分布式表查询数据,会自动汇总各个节点的分片表数据
- 分布式表本身不存储数据
连接
clickhouse 支持3种连接方式,分别使用不同端口,
- 原生tcp默认端口[9000]、
- MySQL默认端口[9004]、
- Http默认端口[8123]
默认用户:default
默认密码:无
常用语句
默认情况下,CREATE、DROP、ALTER和RENAME查询仅影响执行它们的当前服务器。
在集群设置中,可以使用ON CLUSTER子句以分布式方式运行此类查询。
CREATE 创建
# 建库
CREATE DATABASE [IF NOT EXISTS] db_name
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
# 建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
# 在cluster集群的所有节点上创建名
CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
- ON CLUSTER
ClickHouse在指定集群的所有服务器上执行
# 添加表:假定数据已经在对应位置存放,将与表相关的信息添加到服务器
ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
ALTER
ALTER 仅支持 *MergeTree ,Merge以及Distributed等引擎表。
# 改变表结构:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...
# ADD COLUMN — 添加列
# DROP COLUMN — 删除列
# CLEAR COLUMN — 重置列的值
# COMMENT COLUMN — 给列增加注释说明
# MODIFY COLUMN — 改变列的值类型,默认表达式以及TTL
SHOW 查看
# 库
SHOW DATABASES [INTO OUTFILE filename] [FORMAT format]
# 表
SHOW TABLES
# 权限
SHOW GRANTS
# 输出 system.processes表的内容
SHOW PROCESSLIST
# 创建指定对象的 CREATE 语句。返回单个字符串类型的 ‘statement’列
SHOW CREATE [TEMPORARY] [TABLE|DICTIONARY] [db.]table [INTO OUTFILE filename] [FORMAT format]
- CHECK TABLE
# 检查表中的数据是否已损坏。
CHECK TABLE [db.]name
- DESCRIBE TABLE
# 查看表的描述信息,返回各列的Schema,语法如下:
DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
INSERT INTO 导入数据
# 数据插入
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
# 使用SELECT的结果写入
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
# 从文件向表中插入数据
INSERT INTO [db.]table [(c1, c2, c3)] FROM INFILE file_name [COMPRESSION type] FORMAT format_name
# 插入表函数
INSERT INTO [TABLE] FUNCTION table_func ...
删除 DROP、TRUNCATE、DETACH
# 删库
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
# 删表
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
# 删除表中的所有数据
TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
# (假删)删除目标表信息,可通过 ATTACH 查询来重新关联该表
DETACH TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
KILL
WATCH Statement (Experimental)
# 显示语句的执行计划。
EXPLAIN Statement
# 强制终止当前正在运行的语句
KILL QUERY [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.processes query>
[SYNC|ASYNC|TEST]
[FORMAT format]
SET param = value
函数
表函数
聚合函数
客户端
cli
- 交互模式
# 连接
clickhouse-client
# 连接参数
-m :多行作为一行输入
- 非交互(批处理)模式
# 执行query
clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
# 带参数查询
clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}"
在线web页面:Tabix
https://github.com/tabixio/tabix
http
能通过http请求直接查询
curl 'http://localhost:8123/'
curl 'http://localhost:8123/?query=SELECT%201'
wget -nv -O- 'http://localhost:8123/?query=SELECT 1'
mysql驱动
支持mysql驱动连接clickhouse
协议上兼容,
有些语法不兼容,会报错