Clickhouse学习
https://www.cnblogs.com/grapelet520/p/11280972.html#_label4
https://www.jianshu.com/p/a5bf490247ea
centos 7 下按照Clickhouse
1.官网下载rpm包:https://packagecloud.io/Altinity/clickhouse
我个人下载的:
rpm -ivh clickhouse-server-common-20.1.11.73-1.el7.x86_64.rpm
rpm -ivh clickhouse-common-static-20.1.11.73-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-20.1.11.73-1.el7.x86_64.rpm
rpm -ivh clickhouse-client-20.1.11.73-1.el7.x86_64.rpm
service clickhouse-server start
clickhouse-client
停止:
service clickhouse-server stop
启动:
service clickhouse-server start
用clickhouse-client连接本机clickhouse-server服务器:
Clickhouse-client
用本机clickhouse-client连接远程clickhouse-server服务器:
clickhouse-client –host 192.168.3.54 –port 9000 –database default–user default –password
放开远程访问
vi /etc/clickhouse-server/config.xml
修改服务器的配置文件/etc/clickhouse-server/config.xml,第88行,放开注释即可,修改之后的内容如下:
<listen_host>::</listen_host> <--------主要这一行
2.登录:默认default 用户,无需密码
创建用户:vim /etc/clickhouse-server/users.xml 修改users.xml文件
<users>
.......
<sangfor> --->用户名
<networks incl="networks" replace="replace">
<ip>::/0</ip> ---->允许所有地址访问
</networks>
<password>*****123</password> ---->明文密码
<profile>default</profile>
<quota>default</quota>
</sangfor>
........
</users>
如通过 /etc/clickhouse-server/user.xml 创建用户:sangfor
指定用户登录:clickhouse-client -u sangfor --password your_pwd
3.创建数据库:
CREATE DATABASE test ENGINE = Ordinary;
创建表:
CREATE TABLE db.tb1
(
`id` UInt16,
`col1` String,
`col2` String,
`create_date` date
)
ENGINE = MergeTree(create_date, id, 8192)
ENGINE:是表的引擎类型,
MergeTree:最常用的,MergeTree要求有一个日期字段,还有主键。
Log引擎没有这个限制,也是比较常用。
ReplicatedMergeTree:MergeTree的分支,表复制引擎。
Distributed:分布式引擎。
create_date:是表的日期字段,一个表必须要有一个日期字段。
id:是表的主键,主键可以有多个字段,每个字段用逗号分隔。
8192:是索引粒度,用默认值8192即可。
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] #删除数据库
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] #删除表
drop table if exists test.tb1;
创建表:
create table test.tb1 (sdt Date, id UInt16, name String, point UInt16) ENGINE=MergeTree(sdt, (id, name), 10);
插入数据:
insert into test.tb1 (sdt, id, name, point) values ('2020-04-28',12,'sangfor',20);
二、创建表规则 ENGINE = MergeTree(date,id,8192)
MergeTree引擎提供了根据日期进行索引和根据主键进行索引,同时提供了实时更新数据的功能(如,在写入数据的时候就可以对已写入的数据进行查询,不会阻塞。),mergetree是clickhouse里最先进的表引擎,不要跟merge引擎混淆。
这个引擎接受参数形式如下:日期类型的列,可选的示例表达式,一个元祖定义了这个表的主键,索引的间隔尺寸。
MergeTree(EventDate,(CounterID,EventDate),8192)
包含示例的mergeTree:
MerTree(EventDate,intHash32(UserId),(CounterID,EventDate,intHash32(UserID)),8192)
MergeTree
一个mergetree类型的表必须有一个包含date类型的列,在上面的例子里,该列是EventDate,这个日期列的类型必须是'Date'(不是‘DateTime’)
这个主键必须是一个元祖,元素内容通常是表里的列或者一个单一的表达式。
这个可选的示例可以是任何的表达式,但是这个表达式必须出现在主键里.上面的示例里使用的是一个哈希类型的userID,来伪随机的对主键里的CounterID和EventDate进行打散。换句话说,当使用了这个示例列的时候,可以伪随机的将用户打散成为均匀的子集。
这个表是由很多个part构成。每一个part按照主键进行了排序,除此之外,每一个part含有一个最小日期和最大日期。当插入数据的时候,会创建一个新的sort part,同时会在后台周期性的进行merge的过程,当merge的时候,很多个part会被选中,通常是最小的一些part,然后merge成为一个大的排好序的part。
换句话说,整个这个合并排序的过程是在数据插入表的时候进行的。这个merge会导致这个表总是由少量的排序好的part构成,而且这个merge本身并没有做特别多的工作。
在插入数据的过程中,属于不同的month的数据会被分割成不同的part,这些归属于不同的month的part是永远不会merge到一起的。这么做的目的是provide local data modification(比较容易做备份)。
这些part在进行合并的时候会有一个大小的阈值,所以不会有太长的merge过程。
对于每一个part,会生成一个索引文件。这个索引文件存储了表里面每一个索引块里数据的主键的value值,换句话说,这是个对有序数据的小型索引。
对列来说,在每一个索引块里的数据也写入了标记,从而让数据可以在明确的数值范围内被查找到。
当读表里的数据时,SELECT查询会被转化为要使用哪些索引。这些索引会被用在判断where条件或者prewhere条件中,来判断是否打中了这些索引区间。
因此,能够快速查询一个或多个主键范围的值。在下面的示例中,能够快速的查询一个明确的counter,指定范围的日期区间里的一个明确的counter,各种counter的集合等。