福永专业外贸网站建设公司天猫商城商品来源

当前位置: 首页 > news >正文

福永专业外贸网站建设公司,天猫商城商品来源,六安做网站的公司,百度一下1688进入正文前#xff0c;感谢宝子们订阅专题、点赞、评论、收藏#xff01;关注IT贫道#xff0c;获取高质量博客内容#xff01; #x1f3e1;个人主页#xff1a;含各种IT体系技术#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 … 进入正文前感谢宝子们订阅专题、点赞、评论、收藏关注IT贫道获取高质量博客内容 个人主页含各种IT体系技术IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 订阅拥抱独家专题你的订阅将点燃我的创作热情 点赞赞同优秀创作你的点赞是对我创作最大的认可 ⭐️ 收藏收藏原创博文让我们一起打造IT界的荣耀与辉煌 ✏️评论留下心声墨迹你的评论将是我努力改进的方向 目录 1. 一级索引 2. 二级索引跳数索引 1. 一级索引 在MergeTree中PRIMARY KEY 主键并不用于去重而是用于索引加快查询速度,MergeTree会根据index_granularity间隔默认8192行为数据表生成一级索引并保存至primary.idx文件内索引数据按照PRIMARY KEY 排序相对于使用PRIMARY KEY 更常见的方式是通过ORDER BY 方式指定主键。 稀疏索引 primary.idx文件内的一级索引采用稀疏索引实现。有稀疏索引就有稠密索引二者区别如下 在稠密索引中每一行索引标记都会对应到一行具体的数据记录。而在稀疏索引中每一行索引标记对应的是一段数据而不是一行。 稀疏索引的优势显而易见仅需要使用少量的索引标记就能够记录大量的数据区间位置信息而且数据量越大优势越明显。在MergeTree系列引擎表中对应的primary.idx文件就是稀疏索引由于稀疏索引占用空间小所以primary.idx内的索引数据常驻内存。 索引粒度 在clickhouse MergeTree引擎中默认的索引粒度是8192参数为index_granularity一般我们不会修改此值按照默认8192即可。我们可以通过以下sql语句查看每个MergeTree引擎表对应的index_granulariry的值 node1 :) show create table t_mt; 索引粒度对于MergeTree表引擎非常重要可以根据整个数据的长度按照索引粒度对数据进行标注然后抽取对应的数据形成索引。 索引形成过程 表数据以index_granularity的粒度默认8192被标记成多个小区间其中每个区间最多8192行数据每个区间标记后形成一个MarkRange,通过start和end表示MarkRange的具体范围数据文件也会按照index_granularity的间隔粒度生成压缩数据块。由于是稀疏索引MergeTree需要间隔index_granularity行数据生成一条索引同时对应一个索引编号每个MarRange与一个索引编号对应通过与start及end对应的索引编号的取值可以得到对应的数值区间索引编号对应的索引值会依据声明的主键字段获取最终索引编号和索引值被写入primary.idx文件中保存。 假设现在有一份测试数据共192行记录其中主键ID为String类型ID值从A000开始后面依次为A001、A002…直到A192为止假设我们设置MergeTree的索引粒度index_granularity3,根据索引的生成规则primary.idx文件内的索引数据如下 根据索引数据MergeTree将此数据片段划分成192/364个小的MarkRange,其中所有MarkRange的最大数值区间为[A000,inf),划分的MarkRange如下 索引查询过程 使用索引查询其实就是两个数值区间的交集判断其中一个区间是有基于主键的查询条件转换而来的条件区间而另一个区间是上图中MarkRange对应的数值区间。 整个索引查询的过程大致分为3个步骤

  1. 生成查询条件区间 查询时首先将查询条件转换为条件区间即便是单个值的查询条件也会转换成区间的形式例如 WHERE IDA003[A003,A003]WHERE IDA000[A000,inf]WHERE IDA188(-inf,A188]WHERE ID like A006%(A006,A007]
  2. 递归交集判断 以递归的方式依次对MarkRange的数值区间与条件区间做交集判断从最大的区间[A000,inf)开: 如果不存在交集则直接忽略掉整段MarkRange如果存在交集且MarkRange步长大于8(end-start),则将此区间进一步拆分成8个区间由merge_tree_coarse_index_granularity指定默认值为8并重复此规则继续做递归交集判断。如果存在交集且MarkRange不可再分解步长小于8则记录MarkRange并返回。
  3. 合并MarkRange区间 将最终匹配的MarkRange聚在一起合并他们的范围。 当查询条件WHERE ID A003的时候最终读取[A000,A003)和[A003,A006]两个区间的数据即可他们对应的MarkRange(start:0,end:2)范围而无其他无用的区间都被裁剪过滤掉因为MarkRange转换的数值区间是闭区间所以会额外匹配到临近的一个区间完整的逻辑图如下图所示 2. 二级索引跳数索引 除了一级索引之外MergeTree同样支持二级索引二级索引又称为跳数索引由数据的聚合信息构建而成根据索引类型的不同其聚合信息的内容也不同跳数索引的目的与一级索引一样也是帮助查询时减少数据扫描的范围。 跳数索引需要在Create语句内定义完整语法如下 INDEX index_name expr TYPE index_type(…) GRANULARITY granularity 对以上参数的解释如下 index_name:定义的二级索引名称index_type:跳数索引类型最常用就是minmax索引类型。minmax索引记录了一段数据内的最小和最大极值其索引的作用类似分区目录能够快速跳过无用的数据区间。granularity:定义聚合信息汇总的粒度。 与一级索引一样如果在建表语句中声明了跳数索引则会在路径“/var/lib/clickhouse/data/DATABASE/TABLE/PARTITION/”目录下生成索引与标记文件skp_idx.idx与skp_idx.mrk。 在接触跳数索引时很容易将index_granularity与granularity概念混淆对于跳数索引而言index_granularity定义了数据的粒度而granularity定义了聚合信息汇总的粒度也就是说granularity定义了一行跳数索引能够跳过多少个index_granularity区间的数据。 minmax跳数索引的生成规则 minmax跳数索引聚合信息是在一个index_granularity区间内数据的最小和最大极值。首先数据按照index_granularity粒度间隔将数据划分成n段总共有[0~n-1]个区间ntotal_rows/index_granularity向上取整接着根据跳数索引从0区间开始依次按index_granularity粒度从数据中获取聚合信息每次向前移动1步聚合信息逐步累加最后当移动granularity次区间时则汇总并生成一行跳数索引数据。 以下图为例假设index_granularity8192且granularity3,则数据会按照index_granularity划分成n等份MergeTree从第0段分区开始依次获取聚合信息当获取到第3个分区时granularity3则汇总并生成第一行minmax索引前3段minmax极值汇总后取值为[1,9]。 minmax跳数索引案例 #删除表 t_mtnode1 :) drop table t_mt;#重新创建t_mt表包含二级索引node1 :)CREATE TABLE t_mt(id UInt8,name String,age UInt8,birthday Date,location String,INDEX a id TYPE minmax GRANULARITY 5)ENGINE MergeTreePARTITION BY toYYYYMM(birthday)ORDER BY (id, age)PRIMARY KEY id#插入数据insert into t_mt values (1,张三,18,2021-06-01,上海), (2,李四,19,2021-02-10,北京), (3,王五,12,2021-06-01,天津), (1,马六,10,2021-06-18,上海), (5,田七,22,2021-02-09,广州);#查看数据分区路径 如需博文中的资料请私信博主。