ClickHouse(十):Clickhouse表引擎 - Special系列表引擎

news2024/11/20 14:44:32

 

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!


目录

1. Memory

​​​​​​​2. Merge

​​​​​​​3. Distributed


1. ​​​​​​​Memory

Memory表引擎直接将数据保存在内存中,ClickHouse中的Memory表引擎具有以下特点:

  1. Memory 引擎以未压缩的形式将数据存储在 RAM 中,数据完全以读取时获得的形式存储。
  2. 并发数据访问是同步的,锁范围小,读写操作不会相互阻塞。
  3. 不支持索引。
  4. 查询是并行化的,在简单查询上达到最大速率(超过10 GB /秒),在相对较少的行(最多约100,000,000)上有高性能的查询。
  5. 没有磁盘读取,不需要解压缩或反序列化数据,速度更快(在许多情况下,与 MergeTree 引擎的性能几乎一样高)。
  6. 重新启动服务器时,表存在,但是表中数据全部清空。
  7. Memory引擎多用于测试。
  1. 示例:
#在 newdb中创建表 t_memory ,表引擎使用Memory

node1 :) create table t_memory(id UInt8 ,name String, age UInt8) engine = Memory;



CREATE TABLE t_memory

(

    `id` UInt8,

    `name` String,

    `age` UInt8

)

ENGINE = Memory

Ok.

0 rows in set. Elapsed: 0.008 sec.



#向表 t_memory中插入数据

node1 :) insert into t_memory values (1,'张三',18),(2,'李四',19),(3,'王五',20);



INSERT INTO t_memory VALUES



Ok.

3 rows in set. Elapsed: 0.004 sec.



#查询表t_memory中的数据

node1 :) select * from t_memory;



SELECT *

FROM t_memory

┌─id─┬─name─┬─age─┐

│  1  │ 张三  │  18 │

│  2  │ 李四  │  19 │

│  3  │ 王五  │  20 │

└────┴──────┴─────┘

3 rows in set. Elapsed: 0.004 sec.



#重启clickhouse 服务

[root@node1 ~]# service clickhouse-server restart

Stop clickhouse-server service: DONE

Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/

DONE



#进入 newdb 库,查看表 t_memory数据,数据为空。

node1 :) select * from t_memory;



SELECT *

FROM t_memory

Ok.

0 rows in set. Elapsed: 0.003 sec.

注意:”Memory”表引擎写法固定,不能小写。同时创建好表t_memory后,在对应的磁盘目录/var/lib/clickhouse/data/newdb下没有“t_memory”目录,基于内存存储,当重启ClickHouse服务后,表t_memory存在,但是表中数据全部清空。

​​​​​​​2. Merge

Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据,这里需要多个表的结构相同,并且创建的Merge引擎表的结构也需要和这些表结构相同才能读取。

读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表如果设置了索引,索引也会被使用。

Merge 引擎的参数:一个数据库名和一个用于匹配表名的正则表达式:

Merge(数据库, 正则表达式)

例如:Merge(hits, '^WatchLog') 表示数据会从 hits 数据库中表名匹配正则 ‘^WatchLog’ 的表中读取。

注意:当选择需要读取的表时,会匹配正则表达式匹配上的表,如果当前Merge表的名称也符合正则表达式匹配表名,这个Merge表本身会自动排除,以避免进入递归死循环,当然也可以创建两个相互无限递归读取对方数据的 Merge 表,但这并没有什么意义。

  • 示例:
#在newdb库中创建表m_t1,并插入数据

node1 :) create table m_t1 (id UInt8 ,name String,age UInt8) engine = TinyLog;

node1 :) insert into m_t1 values (1,'张三',18),(2,'李四',19)



#在newdb库中创建表m_t2,并插入数据

node1 :) create table m_t2 (id UInt8 ,name String,age UInt8) engine = TinyLog;

node1 :) insert into m_t2 values (3,'王五',20),(4,'马六',21)



#在newdb库中创建表m_t3,并插入数据

node1 :) create table m_t3 (id UInt8 ,name String,age UInt8) engine = TinyLog;

node1 :) insert into m_t3 values (5,'田七',22),(6,'赵八',23)



#在newdb库中创建表t_merge,使用Merge引擎,匹配m开头的表

node1 :) create table t_merge (id UInt8,name String,age UInt8) engine = Merge(newdb,'^m');



#查询 t_merge表中的数据

node1 :) select * from t_merge;



SELECT *

FROM t_merge

┌─id─┬─name─┬─age─┐

│  1  │ 张三  │  18 │

│  2  │ 李四  │   19 │

└────┴─────┴────┘

┌─id─┬─name─┬─age─┐

│  3  │ 王五  │  20 │

│  4  │ 马六  │  21 │

└────┴─────┴────┘

┌─id─┬─name─┬─age─┐

│  5  │ 田七  │  22 │

│  6  │ 赵八  │  23 │

└────┴─────┴────┘

6 rows in set. Elapsed: 0.008 sec.

注意:t_merge表不会在对应的库路径下产生对应的目录结构。

​​​​​​​3. Distributed

Distributed是ClickHouse中分布式引擎,之前所有的操作虽然说是在ClickHouse集群中进行的,但是实际上是在node1节点中单独操作的,与node2、node3无关,使用分布式引擎声明的表才可以在其他节点访问与操作。

Distributed引擎和Merge引擎类似,本身不存放数据,功能是在不同的server上把多张相同结构的物理表合并为一张逻辑表。

分布式引擎语法:

Distributed(cluster_name, database_name, table_name[, sharding_key])

对以上语法解释:

  • cluster_name:集群名称,与集群配置中的自定义名称相对应。配置在/etc/metrika.xml文件中,如下图:

  • database_name:数据库名称。
  • table_name:表名称。
  • sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。

注意:创建分布式表是读时检查的机制,也就是说对创建分布式表和本地表的顺序并没有强制要求。

  • 示例:
#在node1、node2、node3节点上启动ClickHouse 服务

[root@node1 ~]# service clickhouse-server start

[root@node2 ~]# service clickhouse-server start

[root@node3 ~]# service clickhouse-server start



#使用默认的default库,在每个节点上创建表 test_table

node1 :) create table test_local (id UInt8,name String) engine= TinyLog

node2 :) create table test_local (id UInt8,name String) engine= TinyLog

node3 :) create table test_local (id UInt8,name String) engine= TinyLog



#在node1上创建分布式表 t_distributed,表引擎使用 Distributed 引擎

node1 :) create table t_distributed(id UInt8,name String) engine = Distributed(clickhouse_cluster_3shards_1replicas,default,test_local,id);

注意:以上分布式表 t_distributed 只存在与node1节点的clickhouse中。



#分别在node1、node2、node3节点上向表test_local中插入2条数据

node1 :) insert into test_local values (1,'张三'),(2,'李四');

node2 :) insert into test_local values (3,'王五'),(4,'马六');

node3 :) insert into test_local values (5,'田七'),(6,'赵八');



#查询分布式表 t_distributed 中的数据

node1 :) select * from t_distributed;

SELECT *

FROM t_distributed

┌─id─┬─name─┐

│  1   │ 张三   │

│  2   │ 李四  │

└──┴────┘

┌─id─┬─name─┐

│  5  │ 田七    │

│  6  │ 赵八   │

└──┴────┘

┌─id─┬─name─┐

│  3  │ 王五    │

│  4  │ 马六   │

└──┴────┘

6 rows in set. Elapsed: 0.010 sec.



#向分布式表 t_distributed 中插入一些数据,然后查询 node1、node2、node3节点上的test_local数据,发现数据已经分布式存储在不同节点上

node1 :) insert into t_distributed values (7,'zs'),(8,'ls'),(9,'ww'),(10,'ml'),(11,'tq'),(12,'zb');



#node1查询本地表 test_local

node1 :) select * from test_local;

SELECT *

FROM test_local

┌─id─┬─name─┐

│  1   │ 张三   │

│  2   │ 李四   │

│  9   │ ww     │

│ 12   │ zb     │

└───┴────┘

4 rows in set. Elapsed: 0.004 sec.



#node2查询本地表 test_local

node2 :) select * from test_local;

SELECT *

FROM test_local

┌─id─┬─name─┐

│  3   │ 王五   │

│  4   │ 马六   │

│  7   │ zs     │

│ 10   │ ml     │

└───┴────┘

4 rows in set. Elapsed: 0.004 sec. 



#node3查询本地表 test_local

node3 :) select * from test_local;

SELECT *

FROM test_local

┌─id─┬─name─┐

│  5   │ 田七   │

│  6   │ 赵八   │

│  8   │ ls     │

│ 11   │ tq     │

└───┴────┘

4 rows in set. Elapsed: 0.005 sec.

以上在node1节点上创建的分布式表t_distributed 虽然数据是分布式存储在每个clickhouse节点上的,但是只能在node1上查询t_distributed 表,其他clickhouse节点查询不到此分布式表。如果想要在每台clickhouse节点上都能访问分布式表我们可以指定集群,创建分布式表:

#创建分布式表 t_cluster ,引擎使用Distributed 引擎

node1 :) create table t_cluster on cluster clickhouse_cluster_3shards_1replicas (id UInt8,name String) engine = Distributed(clickhouse_cluster_3shards_1replicas,default,test_local,id);

CREATE TABLE t_cluster ON CLUSTER clickhouse_cluster_3shards_1replicas

(

    `id` UInt8,

    `name` String

)

ENGINE = Distributed(clickhouse_cluster_3shards_1replicas, default, test_local, id)

┌─host──┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐

│ node3 │ 9000 │      0 │       │                   2 │                0 │

│ node2 │ 9000 │      0 │       │                   1 │                0 │

│ node1 │ 9000 │      0 │       │                   0 │                0 │

└───────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

3 rows in set. Elapsed: 0.152 sec.

上面的语句中使用了ON CLUSTER分布式DDL(数据库定义语言),这意味着在集群的每个分片节点上,都会创建一张Distributed表,这样便可以从其中任意一端发起对所有分片的读、写请求。


👨‍💻如需博文中的资料请私信博主。


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

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

相关文章

ad+硬件每日学习十个知识点(19)23.7.30 (LDO参数介绍)

文章目录 1.LDO的压差dropout2.线性调整率(输入变化对输出的影响)3.负载调整率(负载变化对输出电压的影响)4.纹波抑制比PSRR(电源抑制比)5.哪些元器件对PSRR影响大?(右下角图&#x…

算法通过村——Hash和队列问题解析

算法的备胎Hash和找靠山的队列 备胎Hash Hash,不管是算法,还是在工程中都会大量使用。很多复杂的算法问题都用Hash能够轻松解决,也正是如此,在算法例就显得没什么思维含量,所以Hash是应用里的扛把子,但在算…

Flink State 和 Fault Tolerance详解

有状态操作或者操作算子在处理DataStream的元素或者事件的时候需要存储计算的中间状态,这就使得状态在整个Flink的精细化计算中有着非常重要的地位: 记录数据从某一个过去时间点到当前时间的状态信息。以每分钟/小时/天汇总事件时,状态将保留…

录屏功能怎么录声音?这些方法都能很好的录制

在现代社交媒体的时代,录制视频已成为了人们记录生活和分享经验的重要方式之一。而在录制视频的过程中,声音也是至关重要的一个方面。因此,在手机上使用录屏功能时,如何录制声音成为了一个常见的问题。本文将介绍如何在手机上使用…

Maven可选依赖和排除依赖简单使用

可选依赖 可选依赖指对外隐藏当前所依赖的资源 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候&#xff0c;添加optional <dependency><groupId>com.rqz</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT&…

python-Excel数据模型文档转为MySQL数据库建表语句(需要连接数据库)-工作小记

将指定Excel文档转为create table 建表语句。该脚本适用于单一且简单的建表语句 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 17:50 # Author: 水兵没月 # File : excel_2_mysql建表语句.py import reimport pandas as pd import mysql.connectordb 库名mydb m…

Excel·VBA表格横向、纵向相互转换

如图&#xff1a;对图中区域 A1:M6 横向表格&#xff0c;转换成区域 A1:C20 纵向表格&#xff0c;即 B:M 列转换成每2列一组按行写入&#xff0c;并删除空行。同理&#xff0c;反向操作就是纵向表格转换成横向表格 目录 横向转纵向实现方法1转换结果 实现方法2转换结果 纵向转横…

Socket层代码重构

src/utils新建socket.js import {io} from "socket.io-client"class Socket{constructor(){this.socket io("http://127.0.0.1:5000");}// 连接socketconnect(){this.socket.connect()}login(username,callback){// emit发送this.socket.emit(login,{&quo…

list交并补差集合

list交并补差集合 工具类依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version> </dependency><dependency><groupId>commons-collections&…

并发编程Part 2

1. JMM 问题&#xff1a;请你谈谈你对volatile的理解? volitile 是 Java 虚拟机提供的一种轻量级的同步机制 &#xff0c;三大特性&#xff1a; 保证可见性 不保证原子性 禁止指令重排 线程之间如何通信&#xff1f; 通信是指线程之间以如何来交换信息。一般线程之间的通信…

HTML+CSS+JavaScript:随机点名案例

一、需求 1、点击开始按钮&#xff0c;姓名随机切换 2、点击结束按钮&#xff0c;姓名停止切换&#xff0c;此时显示的姓名即为被抽中者 3、同一个人不能被重复抽中 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE htm…

Scrum.org-ScrumMaster认证课-PSM培训

在敏捷学习的道路上继续前行&#xff0c;Leangoo领歌的PSM课程已经开启&#xff0c;认证全球认可&#xff0c;还不用续证&#xff0c;可以了解一下。 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交…

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…

Windows用户如何安装新版本cpolar内网穿透超详细教程

Windows用户如何安装新版本cpolar内网穿透 文章目录 Windows用户如何安装新版本cpolar内网穿透 在科学技术高度发达的今天&#xff0c;我们身边充斥着各种电子产品&#xff0c;这些电子产品不仅为我们的工作带来极大的便利&#xff0c;也让生活变得丰富多彩。我们可以使用便携的…

方法论揭秘|研发数字化转型,这家保险企业做对了什么?

7月27日&#xff0c;FCS 2023 第 7 届中国金融 CIO 峰会&#xff08;深圳站&#xff09;如期举行。大会以「洞见智慧金融」为主题&#xff0c;深度解读中国金融行业数字化转型现状&#xff0c;探讨金融行业信息化趋势、数字供应链金融服务、金融科技创新等问题&#xff0c;期望…

js:使用LetterAvatar通过canvas实现浏览器中生成字母头像

实现效果 LetterAvatar的原理就是利用了浏览器对象canvas 在线体验&#xff1a;https://mouday.github.io/tools/pages/letter-avatar/index.html LetterAvatar.js 完整代码 /** LetterAvatar* * Artur Heinze* Create Letter avatar based on Initials* based on https:/…

环形链表的进一步探究

茕茕白兔&#xff0c;东走西顾&#xff0c;衣不如新&#xff0c;人不如故 往期回顾&#xff1a; 数据结构——双向链表 数据结构——单链表 数据结构——顺序表 文章目录 如何判断一个链表是否为环形链表 环形链表的判断的深入探究 例1&#xff1a;沸羊羊追美羊羊 例…

多线程案例(3)

文章目录 多线程案例三三、 定时器 大家好&#xff0c;我是晓星航。今天为大家带来的是 多线程案例三 相关的讲解&#xff01;&#x1f600; 多线程案例三 三、 定时器 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就…

AgileBoot - 全栈项目启动

AgileBoot-Back-End: 基于Ruoyi做了大量重构优化的基础快速开发框架。采用Springboot Vue 3 Mybatis Plus 更面向对象的业务建模 面向生产的项目。&#xff08;非玩具项目&#xff09; 首先克隆代码&#xff0c;同是克隆前端和后端的代码。 前端代码启动&#xff1a; np…

机器学习---概述(二)

文章目录 1.模型评估1.1 分类模型评估1.2 回归模型评估 2. 拟合2.1 欠拟合2.2 过拟合2.3 适当拟合总结&#xff1a; 3.深度学习3.1层次&#xff08;Layers&#xff09;&#xff1a;3.2 神经元&#xff08;Neurons&#xff09;&#xff1a;3.3 总结 1.模型评估 模型评估是机器学…