ClickHouse笔记

这篇具有很好参考价值的文章主要介绍了ClickHouse笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

列式存储数据库(DBMS),使用 C++
语言编写,主要用于在线分析处理查询(OLAP)

ClickHouse 的特点

 1.列式存储
 2.DBMS 的功能几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML,以及配套的各种函数,用户管

理及权限管理,数据的备份与恢复
3.多样化引擎:合并树、日志、接口和其他四大类 20 多种引擎。
4.高吞吐写入能力
类 LSM Tree的结构,定期在后台 Compaction,顺序 append 写,50MB-200MB/s 的写入吞吐能力,按照每行
100Byte 估算,大约相当于 50W-200W 条/s 的写入速度
5.数据分区与线程级并行
partition 再进一步划分为多个 index granularity(索引粒度),然后通过多个 CPU核心分别处理其中的一部分来实现并行数据处理单条 Query 就能利用整机所有 CPU

数据类型
1.整型范围(-2(n-1)次方2(n-1)-1),无符号整型范围(02(n-1)次方)
2.浮点型
3.布尔型:没有单独的类型来存储布尔值。UInt8 类型,取值限制为 0 或 1
4.Decimal 型
5.字符串
String,FixedString(N)固定长度 N 的字符串
6.枚举类型
Enum8 和 Enum16 对应 Int8和 Int16
7.时间类型
Date 接受年-月-日、Datetime 接受年-月-日 时:分:秒、Datetime64 接受年-月-日 时:分:秒.亚秒
8.数组

表引擎
注意:引擎的名称大小写敏感

1.TinyLog:列文件的形式保存在磁盘上,不支持索引,没有并发控制,是和少量数据,一般可用于平时测试
2.Memory:未压缩的原始形式直接保存在内存当中,不支持索引,简单查询性能高(超过10G/s)),上限大概 1 亿行)
3.MergeTree
中最强大的表引擎,以及该系列,支持索引和分区
3.1:partition by 分区(可选) 如果不填只使用一个分区
列文件+索引文件+表定义文件组成的
以分区为单位并行处理
数据先写入临时分区,大概10-15分钟后,自动执行合并(optimize 手动方式)将临时分区的数据合并到已有的分区
3.2primary key 主键(可选)
只提供了数据的一级索引,可以存在相同 primary key 的数据
where条件中使用主键,使用二分查找定位到对应的index granularity,避免全部扫描
index granularity(索引粒度),默认8192,除非存在大量重复值,否则不建议修改
3.3 order by(必选)
分区内的数据按照哪些字段顺序进行有序保存
主键必须是 order by 字段的前缀字段
3.4二级索引
GRANULARITY N 是设定二级索引对于一级索引粒度的粒度
3.5 数据 TTL
管理数据表或者列的生命周期的功能

ReplacingMergeTree

存储特性完全继承 MergeTree,只是多了一个去重的功能,去重只保证最终去重,但是不保证没有重复数据的出现
去重时机:数据的去重只会在合并的过程中出现
去重范围:分区内部进行去重
去重保留规则:重复数据保留版本字段值最大的。如果不填版本字段,默认按照插入顺序保留最后一条。
结论:
	实际上是使用 order by 字段作为唯一键
	去重不能跨分区
	只有同一批插入(新版本)或合并分区时才会进行去重
	认定重复的数据保留,版本字段值最大的
	如果版本字段相同则按插入顺序保留最后一笔

SummingMergeTree

适合场景:不查询明细,只关心以维度进行汇总聚合结果的场景,预聚合”的引擎
总结:
以 SummingMergeTree()中指定的列作为汇总数据列 可以填写多列必须数字列,如果不填,以所有非维度列且为数字列的字段为汇总数据列
以 order by 的列为准,作为维度列
其他的列按插入顺序保留第一行
不在一个分区的数据不会被聚合
只有在同一批次插入(新版本)或分片合并时才会进行聚合

SQL 操作
mysql支持的sql,ck基本都支持
1.insert
2.Update 和 Delete
Mutation 语句是一种很“重”的操作,而且不支持事务。每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区
3.查询操作
ClickHouse 基本上与标准 SQL 差别不大
4.alter
副本
1.副本写入流程
client写入数据到ck-a,
提交写入日志-zk-cluster
收到写入日志到ck-b
ck-b到目标副本下载新数据

 注意:副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表
 建表语句中的 ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_103')
 第一个参数是分片的 zk_path 一般按照:/clickhouse/table/{shard}/{table_name},第二个参数是副本名称,相同的分片副本名称不能相同

分片集群
1. 分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。
Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据

Distributed(集群名称,库名,本地表名,分片键)
分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()

注意:ClickHouse 的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分
片,避免降低查询性能以及操作集群的复杂性

2. 集群读取流程
客户端发送读取命令:有限选择errors_count小的副本,errors_count 相同的有随机、顺序、随机(优先第一顺位)、host名称近似等四种选择方式

Explain 查看执行计划
EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, …]
SELECT … [FORMAT …]

建表优化

1.时间字段的类型:DateTime 不需要经过函数转换处理,执行效率高、可读性好
2.空值存储类型:接使用字段默认值表示空,或者自行指定一个在业务中无意义的值,不使用Nullable
3.分区和索引:
	按天分区以单表一亿数据为例,分区大小控制在 10-30 个为最佳
	必须指定索引列,ClickHouse 中的索引列即排序列,高级列在前、查询频率大的在前原则,常筛选后的数据满足在百万以内为最佳
4.表参数:建议指定 TTL
5. 写入和删除优化
	尽量不要执行单条或小批量删除和插入操作
	不要一次写入太多分区,或数据写入太快每秒钟发起 2-3 次写入操作,每次操作写入 2w~5w

常见配置

CPU
background_pool_size:允许的前提下建议改成 cpu 个数的 2 倍(线程数),merge线程在该池中使用
background_schedule_pool_size:执行后台任务(复制表、Kafka 流、DNS 缓存更新)的线程数。默 认 128,建议改成 cpu 个数的 2 倍(线程数)
background_distributed_schedule_pool_size:分布式发送执行后台任务的线程数,默认 16,建议改成 cpu个数的 2 倍(线程数)
max_concurrent_queries:最大并发处理的请求数(包含 select,insert 等),默认值 100,推荐 150(不够再加)~300。
max_threads:设置单个查询所能使用的最大 cpu 个数,默认是 cpu 核数

内存
max_memory_usage:表示单次 Query 占用内存最大值
max_bytes_before_external_group_by: max_memory_usage 的一半设置内存
max_table_size_to_drop:建议修改为 0,这样不管多大的分区表都可以删除。否则超过默认值50G的分区删除时报错

存储
ClickHouse 不支持设置多数据目录,为了提升数据 io 性能,可以挂载虚拟券组

ClickHouse 语法优化规则:SQL 优化规则是基于 RBO(Rule Based Optimization),

1.在调用 count 函数时,如果使用的是 count() 或者 count(*),且没有 where 条件,则会直接使用 system.tables 的 total_rows,
2.消除子查询重复字段
3.谓词下推
4.聚合计算外推: sum(UserID * 2)-》 sum(UserID) * 2
5.聚合函数消除
6.删除重复的 order by key
7.删除重复的 limit by key
8.删除重复的 USING Key
9.标量替换
10.三元运算优化:optimize_if_chain_to_multiif 参数,三元运算符会被替换成 multiIf

查询优化

1.单表查询
    Prewhere(只支持mergeTree系列) 替代 where,当查询列明显多于筛选列时使用 Prewhere 可十倍提升查询性能
2.数据采样
	采样修饰符只有在 MergeTree engine 表中才有效,且在创建表时需要指定采样策略
3.列裁剪与分区裁剪
4.orderby 结合 where、limit
5.避免构建虚拟列
6. uniqCombined 替代 distinct:接受 2%左右的数据误差
7.使用物化视图
8。其他注意事项
	查询熔断:避免因个别慢查询引起的服务雪崩的问题
	关闭虚拟内存
	配置 join_use_nulls,leftjoin 右表不存在返回该类型的默认值
	批量写入时先排序
	关注 CPU

多表关联

1.用 IN 代替 JOIN:查询的数据仅从其中一张表出时,可考虑用 IN 操作而不是 JOIN
2.大小表 JOIN:小表在右的原则
3.分布式表使用 GLOBAL:
	两张分布式表上的 IN 和 JOIN 之前必须加上 GLOBAL 关键字,右表只会在接收查询请求

的那个节点查询一次,并将其分发到其他节点上,否则就会查询放大,N2次方(N为分布式表的分片数量)
4.使用字典表
5.提前过滤

数据一致性

即便对数据一致性支持最好的 Mergetree,也只是保证最终一致性:
解决方案:
1.手动 OPTIMIZE
2.通过 Group by 去重
3. 通过 FINAL 查询:FINAL 查询最终的性能和很多因素相关,列字段的大小、分区的数量等等都会影响到最

终的查询时间,所以还要结合实际场景取舍

物化视图

普通视图不保存数据,保存的仅仅是查询语句,物化视图则是把查询的结果根据相应的引擎存入到了磁盘

或内存中

优点:快
缺点:场景有限,一张表物化视图多,耗费资源

基本语法
  也是 create 语法,会创建一个隐藏的目标表来保存视图数据。也可以 TO 表名,保存到

一张显式的表。没有加 TO 表名,表名默认就是 .inner.物化视图名
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name]
[ENGINE = engine] [POPULATE] AS SELECT …

使用限制

  1.必须指定物化视图的 engine 用于数据存储
  2.TO [db].[table]语法的时候,不得使用 POPULATE。
  3.查询语句(select)可以包含下面的子句: DISTINCT, GROUP BY, ORDER BY, LIMIT…
  4.物化视图的 alter 操作有些限制,操作起来不大方便。
  5.若物化视图的定义使用了 TO [db.]name 子语句,则可以将目标表的视图 卸载DETACH 再装载 ATTACH

物化视图的数据更新

  (1)物化视图创建好之后,若源表被写入新数据则物化视图也会同步更新
  (2)POPULATE 关键字决定了物化视图的更新策略
  (3)物化视图不支持同步删除
  (4)物化视图是一种特殊的数据表,可以用 show tables 查看

MaterializeMySQL 引擎
该 database 能映 射 到 MySQL 中 的 某 个 database , 并 自 动 在 ClickHouse 中 创 建 对 应 的
ReplacingMergeTree。ClickHouse 服务做为 MySQL 副本,读取 Binlog 并执行 DDL 和 DML 请
求,实现了基于 MySQL Binlog 机制的业务数据库实时同步功能文章来源地址https://www.toymoban.com/news/detail-616531.html

 特点
	1.MaterializeMySQL 同时支持全量和增量同步
	2.为其所创建的每张 ReplacingMergeTree 自动增加了_sign 和 _version 字段。

到了这里,关于ClickHouse笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【个人笔记】由浅入深分析 ClickHouse

    项目中不少地方使用到ClickHouse,就对它做了一个相对深入一点的了解和研究。并对各种知识点及整理过程中的一些理解心得进行了汇总并分享出来,希望对其他同学能有帮助。 本文主要讲解ClickHouse的特点、读写过程、存储形式、索引、引擎、物化视图等特性。 适合 入门和

    2024年01月20日
    浏览(15)
  • 【clickhouse笔记】 查询表或列的磁盘占用大小

    通过系统表 system.parts 我们可以查询MergeTree表的磁盘占用信息,而通过 system_part_columns 表可以查询具体字段的磁盘占用信息 示例:以下SQL 查询所有表的 磁盘压缩大小 和 原始未压缩磁盘占用、压缩比等信息 示例:以下SQL 查询所有表的所有字段的磁盘压缩大小 和 原始未压缩磁盘

    2024年02月21日
    浏览(11)
  • spark 集成 ClickHouse 和 MySQL (读和写操作)(笔记)

    目录 前言: 一.spark读出 1. spark 读出 MySQL表数据 1.2 spark 读出 ClickHouse表数据  二.spark写入 1. spark 写入 MySQL表数据  2.spark 写入 ClickHouse表数据 这篇文章主要记录的是用spark集成ClickHouse和MySQL, 将数据read出,和将数据write写入表的 (记录笔记) 因为这个不是重点,所以先简单创

    2024年02月07日
    浏览(7)
  • ClickHouse笔记: Ubuntu/Centos下的安装, 配置和用户管理

    ClickHouse 属于 OLAP 数据库 OLTP (On-Line Transaction Processing 联机事务处理), 注重事务处理, 数据记录的性能和安全性 OLAP (On-Line Analytical Processing 联机分析处理), 注重数据分析, 重点在查询的性能 一般使用 OLTP 数据库做业务数据存储, 用 OLAP 数据库做查询分析. 写入性能很高, 基本能到

    2024年02月05日
    浏览(9)
  • ClickHouse列存储(十一)—— ClickHouse

    ClickHouse列存储(十一)—— ClickHouse

    1.数据库基本概念 2.列式存储 3.clickHouse存储设计 4.clickHouse典型应用场景 1、了解数据库基本概念 数据库 DBMS:数据库管理系统 OLTP 数据库 : OLTP(Online transactional processing) OLAP 数据库:OLAP (Online analytical processing) SQL (Structured Query Language) 词法分析 语法分析 AST (Abstract syntax t

    2024年02月10日
    浏览(12)
  • ClickHouse进阶(三):ClickHouse 索引

    ClickHouse进阶(三):ClickHouse 索引

    进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术, IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情! 👍点赞:赞同优秀创作,

    2024年02月10日
    浏览(7)
  • ClickHouse--11--ClickHouse API操作

    ClickHouse--11--ClickHouse API操作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 JDBC–01–简介 ClickHouse java代码 SparkCore 写入 ClickHouse,可以直接采用写入方式。下面案例是使用 SparkSQL 将结果存入 ClickHouse对应的表中。在 ClickHouse 中需要预先创建好对应的结果表 可以通过 Flink 原生

    2024年02月21日
    浏览(11)
  • 基于clickhouse keeper搭建clickhouse集群

    主机名 IP my-db01 192.168.1.214 my-db02 192.168.1.215 my-db03 192.168.1.216 hosts设置 使用 admin 用户安装: 添加官方镜像 安装 clickhouse-server和clickhouse-client 版本信息: 操作系统:CentOS Linux release 7.9.2009 (Core) systemd:219 clickhouse-client:23.2.4.12-1.x86_64 clickhouse-server:23.2.4.12-1.x86_64 clickhouse-commo

    2024年02月12日
    浏览(8)
  • clickhouse 系列2:clickhouse 离线安装

    https://download.csdn.net/download/shangjg03/88353547 /etc/clickhouse-server : 服务端的配置文件目录,包括全局配置config.xml 和用户配置users.xml。 /var/lib/clickhouse : 默认的数据存储目

    2024年02月11日
    浏览(8)
  • 探索ClickHouse——连接Kafka和Clickhouse

    探索ClickHouse——连接Kafka和Clickhouse

    可以从https://downloads.apache.org/kafka/下找到希望安装的版本。需要注意的是,不要下载路径包含src的包,否则会报“Classpath is empty”之类的错误。 配置kafka 将下面这行加入文件的末尾 同时修改log的路径 创建zookeeper service 将下面内容填入上述文件中 创建kafka service 将下面内容填

    2024年02月07日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包