ClickHouse 基础

news2024/11/27 17:10:05

ClickHouse2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询OLAP,能够使用SQL查询实时生成分析数据报告。

一、列式存储

以下面的Tabel为例

IDNameGender
1吴彦祖
2刘亦菲
3陈冠希

【1】采用行式存储时,数据在磁盘上的组织结构为:优点是获取某人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但需要查所有人的姓名时,遍历的很多不需要的数据,甚至需要全表扫描才行。

1吴彦祖2刘亦菲3陈冠希

【2】采用列式存储时,数据在磁盘上的组织结构为:查询所有人的姓名时只需把姓名那一列拿出来就可以了

123吴彦祖刘亦菲陈冠希

列式储存的优点:
【1】对于列的聚合,计数,求和等统计操作优于行式存储。
【2】由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。
【3】由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于cache也有了更大的发挥空间。

二、表引擎

表引擎是ClickHouse的一大特色。可以说,表引擎决定了如何存储表的数据。表引擎的使用方式就是必须显式在创建表时定义该表使用的引擎,以及引擎使用的相关参数。特别注意:引擎的名称大小写敏感

MergeTree

ClickHouse中最强大的表引擎当属MergeTree合并树引擎及该系列*MergeTree中的其他引擎,支持索引和分区,地位可以相当于Innodb之于Mysql。而且基于MergeTree还衍生除了很多子产品,也是非常有特色的引擎。

建表语句: MergeTree其实还有很多参数(绝大多数用默认值即可),但是三个参数是更加重要的,也涉及了关于MergeTree的很多概念。

create table t_order_mt(
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime
) engine =MergeTree
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id,sku_id);

插入数据

insert into t_order_mt values
(101,'sku_001',1000.00,'2020-06-01 12:00:00')

partition by分区(可选): 学过hive的应该都不陌生,分区的目的主要是降低扫描的范围,优化查询速度。如果不填,只会有一个分区。分区目录: MergeTree是以列文件+索引文件+表定义文件组成的,但是如果设定了分区那么这些文件就会保存到不同的分区目录中。并行: 分区后,面对涉及跨分区的查询统计,ClickHouse会以分区为单位并行处理。

数据写入与分区合并:任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区。写入后的某个时刻(大概 10-15 分钟后),ClickHouse会自动执行合并操作(等不及也可以手动通过optimize执行),把临时分区的数据,合并到已有分区中。

optimize table xxxx final;

例如: 再次执行上面的插入操作

insert into t_order_mt values
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),
(102,'sku_002',600.00,'2020-06-02 12:00:00');

查看数据并没有纳入任何分区

手动optimize之后,再次查询

hadoop102 :) optimize table t_order_mt final;

primary key主键(可选):ClickHouse中的主键,和其他数据库不太一样,它只提供了数据的一级索引,但是却不是唯一约束。这就意味着是可以存在相同primary key的数据的。主键的设定主要依据是查询语句中的where条件。根据条件通过对主键进行某种形式的二分查找,能够定位到对应的 index granularity,避免了全表扫描。index granularity:直接翻译的话就是索引粒度,指在稀疏索引中两个相邻索引对应数据的间隔。ClickHouse中的MergeTree默认是8192。官方不建议修改这个值,除非该列存在大量重复值,比如在一个分区中几万行才有一个不同数据。

稀疏索引:稀疏索引的好处就是可以用很少的索引数据,定位更多的数据,代价就是只能定位到索引粒度的第一行,然后再进行进行一点扫描。

order by(必选):order by设定了分区内的数据按照哪些字段顺序进行有序保存。order byMergeTree中唯一一个必填项,甚至比primary key还重要,因为当用户不设置主键的情况,很多处理会依照order by的字段进行处理(比如后面会讲的去重和汇总)。要求:主键必须是order by字段的前缀字段。比如order by字段是id,sku_id那么主键必须是id或者id,sku_id

二级索引

目前在ClickHouse的官网上二级索引的功能在v20.1.2.4之前是被标注为实验性的,在这个版本之后默认是开启的。

老版本使用二级索引前需要增加设置是否允许使用实验性的二级索引(v20.1.2.4开始,这个参数已被删除,默认开启)

set allow_experimental_data_skipping_indices=1;

创建测试表: 其中GRANULARITY N是设定二级索引对于一级索引粒度的粒度。

create table t_order_mt2(
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime,
INDEX a total_amount TYPE minmax GRANULARITY 5
) engine =MergeTree
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id, sku_id);

插入数据

insert into t_order_mt2 values
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),
(102,'sku_002',600.00,'2020-06-02 12:00:00');

对比效果: 那么在使用下面语句进行测试,可以看出二级索引能够为非主键字段的查询发挥作用。

[root lib]$ clickhouse-client --send_logs_level=trace <<< 'select * from t_order_mt2 where total_amount > toDecimal32(900., 2)';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

INT8 中的稀疏性:加速的训练工作流程和NVIDIA TensorRT 最佳实践

INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践 文章目录 INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践结构稀疏量化在 TensorRT 中部署稀疏量化模型的工作流程案例研究&#xff1a;ResNet-34要求第 1 步&#xff1a;…

JDK17新特性 即将成为主流的JDK 深入了解

文章目录 Switch 语句增强优化字符串拼接代码instanceof增强密封类&#xff08;限制继承类&#xff09;ZGC垃圾收集器 对于JDK17比较明显的特性 总结 Switch 语句增强 首先就是简化了Switch语句&#xff1a; 去掉了break及可以直接给返回值赋值。并且再匹配多个值的时候也做了…

AI 导致留学中介文书老师痛失万元月收入?是真的吗?

近日&#xff0c;总部位于伦敦&#xff0c;但在国内多个城市设有分公司的留学服务机构老板张冶告诉在接受记者采访时&#xff0c;他们对留学英国的人士提供的本硕博申请、论文润色、挂科申诉等业务都受到了ChatGPT的影响&#xff0c;甚至有业务线直接萎缩60%以上&#xff0c;有…

【Python】Python系列教程-- Python3 列表(十三)

文章目录 前言访问元组修改元组删除元组元组运算符元组索引&#xff0c;截取元组内置函数关于元组是不可变的 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–…

如何打造高效的IT服务中心

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com 引言 在当今数字时代&#xff0c;IT服务越来越成为企业发展的关键和优势。高效的IT服务中心能够提高员工生产力&#xff0c;改善客户体验&#xff0c;降低IT成本&#xff0c;并为企业数字化转型奠定良好的基础。本文将介绍…

Unity制作二次元卡通渲染角色材质

Unity制作二次元材质角色 大家好&#xff0c;我是阿赵。接下来准备开一个系列&#xff0c;讲一下二次元卡通角色的渲染。   先来看看成品&#xff0c;我从网上下载了著名游戏《罪恶装备》里面的一个角色模型。在没有做材质之前&#xff0c;把贴图赋予上去&#xff0c;给一个U…

3、数据库:Oracle部署 - 系统部署系列文章

Oracle数据库的安装&#xff0c;以前写过一篇&#xff0c;这次将新版的安装再记录一次&#xff0c;让读者能够有所了解&#xff0c;笔者也能够记录下最新版的安装过程。 一、数据库下载&#xff1b; Oracle最新版目前在官网是19c&#xff0c;从下面这个链接进去下载便可。 http…

java的UDP(二)

文章目录 1. DatagramSocket类2. 简单的UDP客户端3. DatagramChannel 1. DatagramSocket类 要收发DatagramPacket&#xff0c;必须打开一个数据报Socket。在java中&#xff0c;数据报Socekt通过DatagramSocekt类创建和访问。服务器Socket需要指定绑定端口&#xff0c;而用户端…

【react框架】结合antd做表单组件的一些心得记录

文章目录 前言功能的实现尽量先看看antd上是否已经提供当一个页面有多个表单组件时&#xff0c;就要优先考虑把值存在状态管理中如果一些表单比较简单且能确保后续不会有功能上的拓展&#xff0c;可以使用业务组件推荐其他的表单库 前言 因为最近在学其他东西&#xff0c;今天…

华中科技大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 华中科技大学计算机考研招生学院是计算机科学与技术学院、软件学院和网络空间安全学院。目前均已出拟录取名单。 华中科技大学计算机科学与技术学院成立于1997年&#xff0c;其前身是原华中理工大学&#xff08;即华中…

2023智源大会议程公开丨AI开源论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、图灵奖得主Geoffrey Hinton、OpenAI创…

chatgpt赋能python:Python反转字符串——简单易学的编程技巧

Python反转字符串——简单易学的编程技巧 你是否曾经遇到过需要反转字符串的情况&#xff1f;例如&#xff0c;你想把“Hello World”转换成“dlroW olleH”&#xff1f;如果是这样&#xff0c;Python可以帮你完成这个任务。在本文中&#xff0c;我们将看到如何使用Python的简…

C++标准模板库 栈容器的使用

我们知道c标准模板库中栈和队列很重要&#xff0c;是考试的重点内容&#xff0c;今天和我一起来学习栈容器的使用吧 特点&#xff1a;先进后出&#xff0c;后进先出&#xff08;餐馆的盘子&#xff09; C中有专门的栈容器stack 常用 Push(S,x);//入栈 POp(S,x);//出栈 GetT…

判断点在多边形内算法的C++实现

本篇博客介绍了使用射线法判断点在多边形内部还是外部的算法&#xff0c;并通过C做了具体实现 1. 算法思路 判断平面内点是否在多边形内有多种算法&#xff0c;其中射线法是其中比较好理解的一种&#xff0c;而且能够支持凹多边形的情况。该算法的思路很简单&#xff0c;就是…

网络基础(二)- TCP协议

TCP协议 TCP全称为 “传输控制协议(Transmission Control Protocol”)。它最重要的是解决在传输层通信的过程中&#xff0c;解决网络通信过程中可靠性的问题。当然&#xff0c;很多人在理解TCP的时候&#xff0c;往往只知道帮我们解决可靠性&#xff0c;但是&#xff0c;同时呢…

JavaWeb三大组件之一Filter(过滤器)

定义 拦截所有访问web资源的请求或者响应(servlet、Jsp页面、HTML页面)&#xff0c;从而实现我们自己的业务逻辑&#xff0c;这些逻辑可以是实现访问权限的控制、过滤敏感词、压缩响应等功能。 原理 过滤器是"链接"在容器的处理过程中的&#xff0c;它会在servle…

2023 华为 Datacom-HCIE 真题题库 09/12--含解析

单项选择题 1.[试题编号&#xff1a;190485] &#xff08;单选题&#xff09;华为交换机MAC地址表的老化时间默认是多少秒? A、500 B、5 C、300 D、400 答案&#xff1a;C 解析&#xff1a;无 2.[试题编号&#xff1a;190484] &#xff08;单选题&#xff09;如图所示&#…

小伙以1.2万元价格拍下一颗“荔枝王”:要将这颗最好的荔枝送给女友

近日&#xff0c;一则海南海口公益拍卖的新闻引起了网友的热议。 一位小伙子以1.2万元的价格拍下了一颗被誉为“荔枝王”的稀有果实&#xff0c;并表示要将这颗最好的荔枝送给自己的女友。 这个举动引起了一些网友的质疑&#xff0c;有人称赞他的浪漫&#xff0c;也有人质疑他的…

免费分享一套 SpringBoot + Vue的排课/选课管理系统,挺漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的SpringBoot Vue 的排课/选课管理系统&#xff0c;分享下哈。 项目介绍 近年来&#xff0c;随着网络学校规模的逐渐增大&#xff0c;人工书写数据已经不能够处理如此庞大的数据。为了更好的适应信息时代的高效性&#x…

Nginx网络服务——虚拟主机设置

Nginx网络服务——虚拟主机设置 一、基于域名的 Nginx 虚拟主机1&#xff0e;为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.修改Nginx的配置文件4.重启服务&#xff0c;访问测试 二、基于IP 的 Nginx 虚拟主机1.设置虚拟主机IP2.修改主配置文件3.重启服务&#xff0c;访问…