clickhouse入门
clickhouse特点:
列式存储,clickhouse cpu占有率非常高,性能好吞吐大
clickhous inset一批数据的时候会保证原子性
docker使用命令:
1.docker run -it clickhouse/clickhouse-server /bin/bash
2.clickhouse --help
3.clickhouse start
4.clickhouse-client //clickhouse-client -m 允许使用多行命令
5.show databases //显示所有数据库
6.use system //使用system数据库
7.show tables //显示当前数据库所有的表
8.quit退出clickhouse客户端
9.cd /usr/bin //clickhouse的命令在这个目录下
10.ls |grep click //搜索文件名带click
11.cd /etc/clickhouse-server //核心的配置文件在这里
12.cd /var/log/clickhouse-server //运行日志在这里
13.cd /var/lib/clickhouse //数据存在这里,metadata是元数据sql文件,data目录下存的是真正的数据
14.vi config.xml 把
15.pwd //显示当前所在目录
clickhouse数据库使用命令:
1.create database test //建一个test数据库
2.show create database test Atomic是库引擎(less 文件名:查看文件)
clickhouse数据类型:
整型:
Int8[-128:127]占8个字节,对应java中的byte
Int16[-32767:32768]占16个字节,对应java中的short
Int32:int
Int64:long
无符号整型:
UInt8[0:255],UInt8[0:65535]
boolean:0表示true,1表示flase
浮点型:Float32-float,Float64-double
Decimal32(s):对精度有要求的用Decimal,s表示小数点后几位
字符类型:使用String类型代替所有字符串,varchar,blog存二进制的大字段,clog存文本的大字段
clickhouse中没有编码的概念,对于不同编码的文本,有不同的处理字符串的函数
枚举类型:Enum8和Enum16 用做1表示男性,2表示女性的这种情况,
CREATE TABLE** t_enum
(
`sex` Enum8('nan' **=** 1, 'nv' **=** 2)
)
**ENGINE** = TinyLog
枚举类型存的存的实际上是int8
数组类型:array(T)表示由类型组成的数组,T可以是任意类型
可为空类型: create table t_text ( test Nullable(Int8) ) ENGINE = TinyLog;
UUID类型:看官方文档介绍
rwx(Owner)r-x(Group)r-x(Other):这个例⼦表⽰的权限是:使⽤者⾃⼰可读,可写,可执⾏;同⼀组的⽤户可读,不可写,可执⾏;其它⽤户可读,不可写,可执⾏。
第⼆个栏位:表⽰⽂件个数。如果是⽂件的话,那这个数⽬⾃然是1了,如果是⽬录的话,那它的数⽬就是该⽬录中的⽂件个数了。
第三个栏位:表⽰该⽂件或⽬录的拥有者。若使⽤者⽬前处于⾃⼰的Home,那这⼀栏⼤概都是它的账号名称。
第四个栏位:表⽰所属的组(group)。每⼀个使⽤者都可以拥有⼀个以上的组,不过⼤部分的使⽤者应该都只属于⼀个组,只有当希望给
予某使⽤者特殊权限时,才可能会给他另⼀个组。
第五栏位:表⽰⽂件⼤⼩。⽂件⼤⼩⽤byte来表⽰,⽽空⽬录⼀般都是1024byte,当然可以⽤其它参数使⽂件显⽰的单位不同,如使⽤ls
–k就是⽤kb莱显⽰⼀个⽂件的⼤⼩单位,不过⼀般我们还是以byte为主。
第六个栏位:表⽰最后⼀次修改时间。
第七个栏位:表⽰⽂件名。我们可以⽤ls –a显⽰隐藏的⽂件名。
用户名:default 密码:无
MergeTree表引擎
创建表:
partition by 分区键:分区键有降低数据扫描范围的作用,图上是按天分区。
metadata存的是t_stock.sql 建表语句
data目录下存在分区目录:
第一个1和第二个1表示:每个分区包含一定的数据块,数据块的最小值和数据块的最大值
0表示:数据合并的次数
data.bin是压缩后的数据,primary.idx是组件索引,用于加快查询效率的,data.mrk3用来描述data.bin中的数据和primary.idx的连接。
minmax_create_time.idx最大最小值的索引,带查询时间的时候判断是否是这一个块
columns.txt:存储列信息
count.txt:存了多少条数据,会让count语句非常快
仅用clickhouse-client客户端有分区效果
LSM树特点:在insert的时候先是把数据写入到内存中,后面再合并到硬盘当中(clickhouse后台来处理合并,合并的时间大概是10-15分钟左右)。查询会变慢,需要查内存中的数据和硬盘中的数据,然后进行合并。
手动合并:optimize table t_stock final 内存中的数据刷到硬盘(合并)。
把20200601 _1_1_0和20200601 _5_5_0合并成20200601 _1_5_1这个文件,clickhouse后面会进行一次大合并才会把两外两个文件删除。
order by排序建:分区有序的,加order by 可以通过更快速的查询
primary key 主键:clickhouse并不要求主键的唯一性。order by (id,sku_id) 两列排序
在metadata中的表结构加了index granularity=8192 每个id分区是间隔8192,但是id列重复太多就会大大超过这个值这时需要改这个值。
二级索引:在一级索引的基础上建立索引,在total_amount建立一个二级索引,粒度为5
TTL(time to live)存活时间:不能用于主键,当列中的值过期将会赋给默认值。必须指定一个时间列为起点(d)
ReplacingMergeTree表引擎
官方文档:ReplacingMergeTree.
该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。
数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。
因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
ReplacingMergeTree 的参数:
ver — 版本列。类型为 UInt*, Date 或 DateTime。可选参数。
在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:
如果 ver 列未指定,保留最后一条。
如果 ver 列已指定,保留 ver 值最大的版本。
对于ReplactingMergeTree需要注意的几个重点:
- ReplacingMergeTree是按照order by 指定的排序键作为判断重复的标准。
- 他的去重只限定在一个分区中不能跨区去重。
- 对于判断为重复的数据,保留版本字段最大的一条数据,如果没有指定版本 值或者版本值也有重复的,就会保留最后插入的一条数据。
- ReplacingMergeTree并不能始终保证数据是完全去重的。数据去重只会发生在同一批插入数据以及后台数据合并这两个时机。
SummingMergeTree
SummingMergeTree会对重复的数据进行sum累加再合并
两次insert不会立即合并,需要手动optimize。
数据的修改
clickhouse的数据修改是比较重的 *** 作,需要新建临时分区,然后再合并,所以不介意直接修改数据,采用表引擎对数据进行 *** 作比较合适。
-- 删除 *** 作
altertablet_stockdeletewheresku_id='sku_001';
-- 修改 *** 作
altertablet_stockupdatetotal_amount=toDecimal132(2000.00,2)whereid=2;
数据查询
官方文档查看数据查询.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)