Clickhouse学习之路(三)-- 分布式表、索引原理

一.Clickhouse分布式表(引擎)的概念及举例

1.ClickHouse分布式表的本质并不是一张表,而是一些本地物理表(分片)的分布式视图,本身并不存储数据。

2.支持分布式表的引擎是Distributed,建表DDL语句示例如下,_all只是分布式表名比较通用的后缀而已。

3.分布式(Distributed)表引擎是分布式表的代名词,它⾃身不存储任何数据,⽽是作为数据分⽚的透明代理,能够⾃动的路由数据⾄集群中的各个节点,即分布式表需要和其他数据表⼀起协同⼯作。分布式表会将接收到的读写任务,分发到各个本地表,而实际上数据的存储也是保存在各个节点的本地表中。

在这里插入图片描述

4.分布式表创建规则:
使用on cluster语句在集群的某台机器上执行以下代码,即可在每台机器上创建本地表和分布式表,其中⼀张本地表对应着⼀个数据分⽚,分布式表通常以本地表加“_all”命名。它与本地表形成⼀对多的映射关系,之后可以通过分布式表代理操作多张本地表。
这里有个要注意的点,就是分布式表的表结构尽量和本地表的结构一致。如果不一致,在建表时不会报错,但在查询或者插入时可能会抛出异常。
在集群中使用,我们要加上on cluster <cluster_name>的ddl,这样我们的建表语句在某一台clickhouse实例上执行一次即可分发到集群中所有实例上执行。

5.创建本地表举例:
–使用ReplicatedMergeTree引擎创建本地表test_log

create table test_log on cluster ck_cluster
(
    totalDate Date,
    unikey    String
)
    engine = ReplicatedMergeTree('/clickhouse/test/tables/{shard}/test_log', '{replica}')
        PARTITION BY totalDate
        ORDER BY unikey
        SETTINGS index_granularity = 8192;
ENGINE = Distributed(cluster, database, table, [sharding_key])

参数描述:
cluster:集群名称,在对分布式表执⾏读写的过程中,它会使⽤集群的配置信息来找到相应的host节点。
databasetable:数据库和本地表名称,用于将分布式表映射到本地表上。
sharding_key: 分⽚键,分布式表会按照这个规则,将数据分发到各个本地表中


6.创建分布式表举例:
–创建分布式表test_log_all,数据在读写时会根据rand()随机函数的取值,决定数据写⼊哪个分⽚,也可以用hash取值。

create table test_log_all on cluster ck_cluster
(
    totalDate Date,
    unikey    String
)
    engine = Distributed('ck_cluster', 'test', 'test_log', rand());

联系上面创建的本地表和分布式表,假设我们clickhouse集群有两个节点,其分布式表与本地表的对应关系则如下图所示:
至此,ck_cluster集群的本地表test_log和分布式表test_log_all就创建完成了
在这里插入图片描述

7.我们的插入和查询任务都将使用分布式表,数据是分别保存本地表中的,分布式表是代理或映射关系并不保存数据。可以理解分布式表是nginx,负责将读写任务分发到本地表。

8.如果要彻底删除分布表,则需要分别删除分布式表和本地表,其语法规则如下

--删除分布式表
DROP TABLE test_log_all ON CLUSTER ck_cluster
--删除本地表
DROP TABLE test_log ON CLUSTER ck_cluster

二.Clickhouse索引的概念

1.ClickHouse 默认提供两类索引:稀疏索引和跳数索引。这两类索引都是根据设置的间隔粒度产生索引标记以记录数据的区间位置信息。
稀疏索引 :按主键或排序键进行排序后保存,默认粒度 8192 行。相对于稠密索引而言,稀疏索引只需要使用少量的索引标记就能记录大量数据的区间位置信息,并且这样的索引文件足够小,常驻内存取用更快。
跳数索引 :由数据的聚合(最值 minmax、集合行数 set、N-Gram[1] 布隆过滤器 ngrambf、Token 布隆过滤器 tokenbf)产生,不过相对于稀疏索引而言,跳数索引提供一个索引粒度的选项,即,数据经过间隔粒度构建索引后,跳数索引将会根据索引粒度,对索引数据进行汇总(跳跃)。

2.这里要注意,稀疏索引和跳数索引的 index_granularity(间隔粒度)概念是一致的,即索引所覆盖的行数。而跳数索引的 granularity(索引粒度)则是对于已经构建的索引的一个合并。

3.建索引的正确方式
开始字段不应该是区分度很高的字段,如果是唯一的,那么索引效果非常差,也不能找区分度特别差的,应该找区分度中等,这就涉及到你的SETTINGS的值,如果比较大,可以找区分度稍差的列,如果比较小,找区分度稍大的列作为索引

4.主键(索引,即排序)order by字段选择: 就是把where 里面肯定有的字段加到里面,where 中一定有的字段放到第一位,注意字段的区分度适中即可 区分度太大太小都不好,因为ck的索引时稀疏索引,采用的是按照固定的粒度抽样作为实际的索引值,不是mysql的二叉树,所以不建议使用区分度特别高的字段。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值