ClickHouse安装与引擎

  • 特性
  • 国内源
  • 目录介绍
  • 分布式安装
  • client命令行参数
  • clickhouse 数据类型
  • Clickhouse中的数据库引擎
  • Clickhouse中的表引擎
    • Log系列表引擎
      • TinyLog表引擎
      • StripeLog表引擎
      • Log表引擎
    • Special系列表引擎
      • Memory表引擎
      • Merge 引擎
      • Distributed表引擎
    • MergeTree系列表引擎
      • MergeTree表引擎
        • MergeTree表引擎例子
      • ReplacingMergeTree表引擎
        • ReplacingMergeTree表引擎测试
      • SummingMergeTree表引擎 - 汇总求和
      • AggregatingMergeTree表引擎 - 聚合功能
      • CollapsingMergeTree表引擎 - 乱序写入无法实现折叠删除功能
      • VersionedCollapsingMergeTree表引擎 - 版本折叠功能
    • Integration系列表引擎 - 与外部系统集成
      • HDFS 表引擎
      • MySQL表引擎
      • Kafka表引擎

特性

将流批合体,完成实时查询1. 完备的DBMS系统
2. 列式存储
3. 数据压缩
4. 向量化执行引擎
5. 关系模型与标准SQL查询
6. 多样化的表引擎
7. 多线程与分布式
8. 多主架构
9. 交互式查询
10. 数据分片和分布式查询

国内源

官方源
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repocat > /etc/yum.repos.d/clickhouse.repo <<-EOF
[clickhouse-stable]
name=ClickHouse - Stable Repository
baseurl=https://mirrors.aliyun.com/clickhouse/rpm/stable
gpgkey=https://mirrors.aliyun.com/clickhouse/rpm/stable/repodata/repomd.xml.key
gpgcheck=0
repo_gpgcheck=1
enabled=1[clickhouse-lts]
name=ClickHouse - LTS Repository
baseurl=https://packages.clickhouse.com/rpm/lts/
gpgkey=https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key
gpgcheck=0
repo_gpgcheck=1
enabled=0[clickhouse-prestable]
name=ClickHouse - Pre-stable Repository
baseurl=https://packages.clickhouse.com/rpm/prestable/
gpgkey=https://packages.clickhouse.com/rpm/prestable/repodata/repomd.xml.key
gpgcheck=0
repo_gpgcheck=1
enabled=0[clickhouse-testing]
name=ClickHouse - Testing Repository
baseurl=https://packages.clickhouse.com/rpm/testing/
gpgkey=https://packages.clickhouse.com/rpm/testing/repodata/repomd.xml.key
gpgcheck=0
repo_gpgcheck=1
enabled=0
EOFyum install clickhouse-server clickhouse-client

目录介绍

/etc/clickhouse-server : 服务端的配置文件目录,包括全局配置config.xml 和用户配置users.xml。
/var/lib/clickhouse : 默认的数据存储目录,通常会修改,将数据保存到大容量磁盘路径中。
/var/log/cilckhouse-server : 默认保存日志的目录,通常会修改,将数据保存到大容量磁盘路径中。
在/usr/bin下会有可执行文件:
clickhouse:主程序可执行文件
clickhouse-server:一个指向clickhouse可执行文件的软连接,供服务端启动使用。
clickhouse-client:一个指向clickhouse可执行文件的软连接,供客户端启动使用。

分布式安装

# 先多个节点单节点安装clickhouse
rpm -ivh ./clickhouse*# 安装zookeeper集群并启动# 配置外网可访问
/etc/clickhouse-server/config.xml 164行
#注意每台节点监听的host名称配置当前节点host
<listen_host>::</listen_host># 在每台节点/etc/目录下创建metrika.xml文件 集群信息
cat > /etc/clickhouse-server/config.d/metrika.xml <<-EOF
<yandex><remote_servers><clickHouse_cluster_3shards_1replicas><shard><internal_replication>true</internal_replication><replica><host>node01</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>node02</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>node03</host><port>9000</port></replica></shard></clickHouse_cluster_3shards_1replicas></remote_servers><zookeeper><node index="1"><host>node03</host><port>2181</port></node><node index="2"><host>node04</host><port>2181</port></node><node index="3"><host>node05</host><port>2181</port></node></zookeeper><macros><shard>03</shard> <replica>node03</replica><!-- 这里写每个节点的信息 01-node01 02-node02 --></macros><networks><ip>::/0</ip></networks><clickHouse_compression><case><min_part_size>10000000000</min_part_size><min_part_size_ratio>0.01</min_part_size_ratio><method>lz4</method></case></clickHouse_compression>
</yandex>
EOF# 3个节点分别启动
clickhouse start# 连接服务端
clickhouse-client
clickhouse-client --password
clickhouse-client --host localhost --port 9000#查看当前所有数据库
show databases;#查看当前使用的数据库
select database();查询
select * from system.clusters;出现clickHouse_cluster_3shards_1replicas就表示集群搭建完成

client命令行参数

参数   解释
--host, -h  服务端的host名称, 默认是localhost。您可以选择使用host名称或者IPv4或IPv6地址。
--port  连接的端口,默认值:9000。注意HTTP接口以及TCP原生接口使用的是不同端口。
--user, -u  用户名。 默认值:default。
--password  密码。 默认值:空字符串。
--query,-q   使用非交互模式查询。
--database, -d  默认当前操作的数据库. 默认值:服务端默认的配置(默认是default)。
--multiline, -m 如果指定,允许多行语句查询(Enter仅代表换行,不代表查询语句完结)。
--time, -t  如果指定,非交互模式下会打印查询执行的时间到stderr中。
--stacktrace    如果指定,如果出现异常,会打印堆栈跟踪信息。
--config-file   配置文件的名称。
--multiquery,-n  使用非交互模式查询数据时,可以分号隔开多个sql语句。例子
clickhouse-client  -h node01
clickhouse-client  -h node01 --password
密码 123clickhouse-client -q "show databases"
clickhouse-client -d "system" -q "show tables"
clickhouse-client -m
clickhouse-client -t -q "show databases"
clickhouse-client --stacktrace
clickhouse-client  -n -q "show databases;use default;"

clickhouse 数据类型

select count(*) from system.data_type_families;
select * from system.data_type_families limit 10;MySQL      Hive        ClickHouse(区分大小写)
byte        TINYINT     Int8
short       SMALLINT    Int16
int         INT         Int32
long        BIGINT      Int64
varchar     STRING      String
timestamp   TIMESTAMP   DateTime
float       FLOAT       Float32
double      DOUBLE      Float64
boolean     BOOLEAN     无    select toDecimal(2,3);
int
float
decimal
string
fixedstring
uuid
date
dateTime
dateTime64
bool
Enum
Nullable
Array
Tuple
Nested
Domain

Clickhouse中的数据库引擎

ClickHouse中支持在创建数据库时指定引擎,目前比较常用的两种引擎为默认引擎和MySQL数据库引擎
1.Atomic默认数据库引擎
1.Ordinary创建时需要注意,Ordinary首字母需要大写,不然会抛出异常create database testdb engine = Ordinary;show create database testdb;create database testdb2;show create database testdb2;create database mycl on cluster clickHouse_cluster_3shards_1replicas ENGINE = Atomic;2. Mysql数据库引擎  不允许创建表、修改表、删除数据、重命名操作。 元数据不能修改MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许对表进行INSERT插入和SELECT查询,方便在ClickHouse与MySQL之间进行数据交换。语法:
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')#在MySQL中创建库,表,删除表,修改表属性
CREATE DATABASE `chauncy` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
CREATE TABLE `account` (`username` varchar(10) NOT NULL DEFAULT '',`balance` double DEFAULT NULL,PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `click_mysql` (`username` varchar(10) NOT NULL DEFAULT '',`gender` enum("男","女")
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into click_mysql values("lal","男"),("n1","女"),("n2","男");# 在clickhouse中做映射
CREATE DATABASE mysql_db ENGINE = MySQL('192.168.7.17:3306', 'chauncy', 'meifute', 'meifute');
desc mysql_db.click_mysql;
select * from mysql_db.click_mysql;
insert into mysql_db.click_mysql values('c1','男'),('c2','女'),('c3','男');
删除数据报错 Table engine MySQL doesn't support mutations
alter table click_mysql delete where name ='c1'; # 字段类型
Mysql               ClickHouse
UNSIGNED TINYINT    UInt8
TINYINT             Int8
UNSIGNED SMALLINT   UInt16
SMALLINT            Int16
UNSIGNED            INT
UNSIGNED MEDIUMINT  UInt32
INT, MEDIUMINT      Int32
UNSIGNED BIGINT     UInt64
BIGINT              Int64
FLOAT               Float32
DOUBLE              Float64
DATE                    Date
DATETIME, TIMESTAMP DateTime
BINARY              FixedString

Clickhouse中的表引擎

表引擎在ClickHouse中的作用十分关键,直接决定了
数据如何存储和读取、是否支持并发读写、是否支持index索引、支持的query种类、是否支持主备复制等。Log系列用来做小表数据分析
MergeTree系列用来做大数据量分析
Integration系列则多用于外表数据集成
复制表Replicated系列
分布式表Distributed等

Log系列表引擎

Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景,即一次写入,多次查询。
Log系列表引擎包含:TinyLog、StripeLog、Log三种引擎几种Log表引擎的共性是:数据被顺序append写到本地磁盘上。不支持delete、update修改数据。不支持index(索引)。不支持原子性写。如果某些操作(异常的服务器关闭)中断了写操作,则可能会获得带有损坏数据的表。insert会阻塞select操作。当向表中写入数据时,针对这张表的查询会被阻塞,直至写入动作结束。
它们彼此之间的区别是:TinyLog:不支持并发读取数据文件,查询性能较差;格式简单,适合用来暂存中间数据。StripeLog:支持并发读取数据文件,查询性能比TinyLog好;将所有列存储在同一个大文件中,减少了文件个数。Log:支持并发读取数据文件,查询性能比TinyLog好;每个列会单独存储在一个独立文件中。

TinyLog表引擎

-- 每个字段一个单独文件,还有统计文件
create table t_tinylog(id UInt8,name String,age UInt8) engine=TinyLog;
insert into t_tinylog values (1,'张三',18),(2,'李四',19),(3,'王五',20);
select * from t_tinylog;
alter table t_tinylog delete where id = 1;

StripeLog表引擎

-- 相比TinyLog而言,StripeLog数据存储会划分块,每次插入对应一个数据块,拥有更高的查询性能(拥有.mrk标记文件,支持并行查询)。
-- StripeLog 引擎将所有列存储在一个文件中,使用了更少的文件描述符。
-- 对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。
-- StripeLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。create table t_stripelog(id UInt8,name String,age UInt8) engine = StripeLog;-- 向表t_stripelog中插入数据,这里插入分多次插入,会将数据插入不同的数据块中
insert into t_stripelog values (1,'张三',18);
insert into t_stripelog values (2,'李四',19);
-- linux 命令 ls /var/lib/clickhouse/data/default/t_stripelog-- 查询表 t_stripelog数据
select * from t_stripelog;

Log表引擎

-- Log引擎表适用于临时数据,一次性写入、测试场景。Log引擎结合了TinyLog表引擎和StripeLog表引擎的长处,是Log系列引擎中性能最高的表引擎。
--Log表引擎会将每一列都存在一个文件中,对于每一次的INSERT操作,会生成数据块,经测试,数据块个数与当前节点的core数一致。create table t_log(id UInt8 ,name String ,age UInt8 ) engine = Log;
-- 向表 t_log中插入数据,分多次插入,插入后数据存入数据块
insert into t_log values (1,'张三',18);
insert into t_log values (2,'李四',19);
insert into t_log values (3,'王五',20);
insert into t_log values (4,'马六',21);
insert into t_log values (5,'田七',22);
insert into t_log values (6,'赵六',23);-- 删除数据  Table engine Log doesn't support mutations
alter table t_log delete where id =1;

Special系列表引擎

-- Memory表引擎直接将数据保存在内存中
-- Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据,这里需要多个表的结构相同,并且创建的Merge引擎表的结构也需要和这些表结构相同才能读取
-- Distributed是ClickHouse中分布式引擎

Memory表引擎

--Memory 引擎以未压缩的形式将数据存储在 RAM 中,数据完全以读取时获得的形式存储。
--并发数据访问是同步的,锁范围小,读写操作不会相互阻塞。
--不支持索引。
--查询是并行化的,在简单查询上达到最大速率(超过10 GB /秒),在相对较少的行(最多约100,000,000)上有高性能的查询。
--没有磁盘读取,不需要解压缩或反序列化数据,速度更快(在许多情况下,与 MergeTree 引擎的性能几乎一样高)。
--重新启动服务器时,表存在,但是表中数据全部清空。
--Memory引擎多用于测试。create table t_memory(id UInt8 ,name String, age UInt8) engine = Memory;
insert into t_memory values (1,'张三',18),(2,'李四',19),(3,'王五',20);
select * from t_memory;
--当重启ClickHouse服务后,表t_memory存在,但是表中数据全部清空

Merge 引擎

-- 本身不存数据,映射多张表数据,表结构必须相同
-- Merge 引擎本身不存储数据,但可用于同时从任意多个其他的表中读取数据,这里需要多个表的结构相同,
-- 并且创建的Merge引擎表的结构也需要和这些表结构相同才能读取。
-- 读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表如果设置了索引,索引也会被使用。-- 格式 Merge(数据库, 正则表达式)
-- Merge(hits, '^WatchLog') 表示数据会从 hits 数据库中表名匹配正则 ‘^WatchLog’ 的表中读取-- 在newdb库中创建表m_t1,并插入数据
create table m_t1 (id UInt8 ,name String,age UInt8) engine = TinyLog;
insert into m_t1 values (1,'张三',18),(2,'李四',19);-- 在newdb库中创建表m_t2,并插入数据
create table m_t2 (id UInt8 ,name String,age UInt8) engine = TinyLog;
insert into m_t2 values (3,'王五',20),(4,'马六',21);--在newdb库中创建表m_t3,并插入数据
create table m_t3 (id UInt8 ,name String,age UInt8) engine = TinyLog;
insert into m_t3 values (5,'田七',22),(6,'赵八',23);--在newdb库中创建表t_merge,使用Merge引擎,匹配m开头的表
create table t_merge (id UInt8,name String,age UInt8) engine = Merge(newdb,'^m');-- 查询 t_merge表中的数据
select * from t_merge;

Distributed表引擎

-- Distributed引擎和Merge引擎类似,本身不存放数据,功能是在不同的server上把多张相同结构的物理表合并为一张逻辑表
-- 语法
-- Distributed(cluster_name, database_name, table_name[, sharding_key])
-- cluster_name:集群名称,与集群配置中的自定义名称相对应。配置在metrika.xml文件中
-- database_name:数据库名称。
-- table_name:表名称。
-- sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表-- 类型一 多个表之间映射 类似于merge引擎--使用默认的default库,在每个节点上创建表 test_table-- node01 :) create table test_local (id UInt8,name String) engine= TinyLog;-- node02 :) create table test_local (id UInt8,name String) engine= TinyLog;-- node03 :) create table test_local (id UInt8,name String) engine= TinyLog;-- -- #在node01上创建分布式表 t_distributed,表引擎使用 Distributed 引擎-- node01 :) create table t_distributed(id UInt8,name String) engine = Distributed(clickHouse_cluster_3shards_1replicas,default,test_local,id);-- 注意:以上分布式表 t_distributed 只存在与node1节点的clickhouse中。-- -- #分别在node01、node02、node03节点上向表test_local中插入2条数据-- node01 :) insert into test_local values (1,'张三'),(2,'李四');-- node02 :) insert into test_local values (3,'王五'),(4,'马六');-- node03 :) insert into test_local values (5,'田七'),(6,'赵八');-- -- #查询分布式表 t_distributed 中的数据-- node01 :) 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 中插入一些数据,然后查询 node01、node02、node03节点上的test_local数据,发现数据已经分布式存储在不同节点上-- node01 :) insert into t_distributed values (7,'zs'),(8,'ls'),(9,'ww'),(10,'ml'),(11,'tq'),(12,'zb');-- -- #node1查询本地表 test_local-- node01 :) 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-- node02 :) select * from test_local;-- SELECT *-- FROM test_local-- ┌─id─┬─name─┐-- │  3   │ 王五   │-- │  4   │ 马六   │-- │  7   │ zs     │-- │ 10   │ ml     │-- └───┴────┘-- 4 rows in set. Elapsed: 0.004 sec. -- -- #node03查询本地表 test_local-- node03 :) select * from test_local;-- SELECT *-- FROM test_local-- ┌─id─┬─name─┐-- │  5   │ 田七   │-- │  6   │ 赵八   │-- │  8   │ ls     │-- │ 11   │ tq     │-- └───┴────┘-- 4 rows in set. Elapsed: 0.005 sec. -- 在每台clickhouse节点上都能访问分布式表我们可以指定集群
-- 类型二 分布式表 数据分片 多主-- 创建分布式表 t_cluster ,引擎使用Distributed 引擎  各节点的本地表也要有-- node001 :) create table t_cluster on cluster clickHouse_cluster_3shards_1replicas (id UInt8,name String) engine = Distributed(clickHouse_cluster_3shards_1replicas,default,test_local,id);
-- 插入数据insert into table t_cluster values(1,'n1'),(2,'n2'),(3,'n3');
-- 报异常 Cannot use any of provided ZooKeeper nodes
-- 原因: metrika.xml文件中的zookeeper配置有误

MergeTree系列表引擎

-- MergeTree系列表引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,支持几乎所有ClickHouse核心功能
MergeTree系列表引擎包含:
MergeTree、
ReplacingMergeTree、
SummingMergeTree(汇总求和功能)、
AggregatingMergeTree(聚合功能)、
CollapsingMergeTree(折叠删除功能)、
VersionedCollapsingMergeTree(版本折叠功能)引擎,
在这些的基础上还可以叠加Replicated和Distributed。

MergeTree表引擎

-- 数据片段写入磁盘,后台线程会定期合并
-- 特点: -- 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。-- 支持数据分区,可以通过PARTITION BY语句指定分区字段。-- 支持数据副本。-- 支持数据采样。CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr -- 没有指定主键时,排序字段默认为主键
[PARTITION BY expr]
[PRIMARY KEY expr] -- 指定主键,一般不需要
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]-- 参数解释:
ENGINE = MergeTree() --MergeTree引擎
ORDER BY:[必选项] 排序字段 ORDER BY (Col1, Col2)如果不需要排序: ORDER BY tuple()排序字段默认是主键
PARTITION BY:分区字段 toYYYYMM(date_column)
PRIMARY KEY:指定主键如果指定了PRIMARY KEY与排序字段不一致,要保证PRIMARY KEY 指定的主键是ORDER BY 指定字段的前缀ORDER BY (A,B,C) PRIMARY KEY A 可以ORDER BY (A,B,C) PRIMARY KEY B 不可以
SAMPLE BY:采样字段 SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))
TTL:数据的存活时间
SETTINGS:额外的参数配置

MergeTree表引擎例子

-- 在库 newdb中创建表  t_mt ,使用MergeTree引擎
create table t_mt(id UInt8,name String,age UInt8,birthday Date,location String) engine = MergeTree()order by (id,age)partition by toYYYYMM(birthday);select toYYYYMM(toDate('2022-03-23 13:23:00')); -- 202203
-- 向表中插入数据
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','广州');-- 查看表中的数据
select * from t_mt;
-- 向表t_mt中继续插入以下数据
insert into t_mt values (1,'赵八',11,'2021-06-08','北京'),(2,'李九',19,'2021-02-10','天津'),(3,'郑十',12,'2021-07-01','北京');-- 手动触发表t_mt 的分区合并 默认是15分钟自动合并
optimize table t_mt partition '202102'; -- 针对单个分区
optimize table t_mt partition '202106'; -- 针对单个分区
optimize table t_mt final; -- 全部分区-- 在系统表 system.part中查询表 t_mt的分区信息:
select table ,partition ,name ,active from system.parts where table = 't_mt';
table代表当前表
partition是当前表的分区名称
name是对应到磁盘上数据所在的分区目录片段 如202202_2_2_0
active代表当前分区片段的状态:1代表激活状态,0代表非激活状态-- 磁盘目录
checksums.txt:校验文件,使用二进制格式存储。
columns.txt: 存储当前分区所有列信息。使用明文格式存储。

ReplacingMergeTree表引擎

-- 针对同分区内相同主键的数据进行去重,合并分区时删除重复的数据
-- 并不能完全保障数据不重复
-- ReplacingMergeTree 适用于在后台清除重复的数据以节省空间--ReplaceingMergeTree建表语句
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = ReplacingMergeTree([ver]) -- 指定列的版本,可以是UInt*、Date或者DateTime类型
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]-- 注意:ReplacingMergeTree在去除重复数据时,是以ORDERBY排序键为基准的,而不是PRIMARY KEY在执行分区合并时,会触发删除重复数据不同分区的重复数据不会被去重

ReplacingMergeTree表引擎测试

-- 测试一: 去重按照order by去重,而不是primary key
create table t_replacing_mt(
id UInt8,
name String,
age UInt8,
gender String
) engine = ReplacingMergeTree()
order by (id,age)
primary key id
partition by gender;insert into t_replacing_mt values
(1,'张三',18,'男'),
(2,'李四',19,'女'),
(3,'王五',20,'男');
select * from t_replacing_mt;
insert into t_replacing_mt values (1,'张三',10,'男');
select * from t_replacing_mt;optimize table t_replacing_mt;
select * from t_replacing_mt;
insert into t_replacing_mt values (1,'张三三',18,'男');
select * from t_replacing_mt;
optimize table t_replacing_mt;
select * from t_replacing_mt;-- 测试不指定列式 保留最新的数据
drop table t_replacing_mt;
create table t_replacing_mt(
id UInt8,
name String,
age UInt8,
gender String
) engine = ReplacingMergeTree()
order by id
primary key id
partition by gender;insert into t_replacing_mt values
(1,'张三',18,'男'),
(2,'李四',19,'女'),
(3,'王五',20,'男');select * from t_replacing_mt ;
insert into t_replacing_mt values (1,'张三2',10,'男');
select * from t_replacing_mt;
optimize table t_replacing_mt;
select * from t_replacing_mt;-- 测试指定[ver]列时,插入相同排序字段的数据,保留当前[ver]列最大值。
drop table t_replacing_mt;
create table t_replacing_mt(
id UInt8,
name String,
age UInt8,
gender String
) engine = ReplacingMergeTree(age)
order by id
primary key id
partition by gender;insert into t_replacing_mt values
(1,'张三',18,'男'),
(2,'李四',19,'女'),
(3,'王五',20,'男');
select * from t_replacing_mt ;
insert into t_replacing_mt values (1,'张三2',10,'男'); -- 保留age列最大值
select * from t_replacing_mt;
optimize table t_replacing_mt;
select * from t_replacing_mt;

SummingMergeTree表引擎 - 汇总求和

-- SummingMergeTree对非主键列进行sum聚合
-- 只需要查询数据的汇总结果,不关心明细数据
-- 用ORBER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。
-- 仅对分区内的相同排序key的数据行进行合并
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = SummingMergeTree([columns]) -- 如果不指定列,默认是非主键外的全部列汇总
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...];-- 测试指定一个聚合字段 保留最开始一条数据的信息
create table t_summing_mt(
id UInt8,
name String,
age UInt8,
loc String,
dept String,
workdays UInt8,
salary Decimal32(2)
) engine = SummingMergeTree(salary)
order by (id,age)
primary key id
partition by loc;insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),
(2,'李四',19,'上海','java',22,8000),
(3,'王五',20,'北京','java',26,12000);
select * from t_summing_mt;
insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);
select * from t_summing_mt;
optimize table t_summing_mt;-- 测试指定多个聚合字段
drop table t_summing_mt;
create table t_summing_mt(
id UInt8,
name String,
age UInt8,
loc String,
dept String,
workdays UInt8,
salary Decimal32(2)
) engine = SummingMergeTree((salary,workdays,dept))
order by (id,age)
primary key id
partition by loc;insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),
(2,'李四',19,'上海','java',22,8000),
(3,'王五',20,'北京','java',26,12000);
select * from t_summing_mt;
insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);
select * from t_summing_mt;
optimize table t_summing_mt;

AggregatingMergeTree表引擎 - 聚合功能

-- SummingMergeTree对非主键列进行sum聚合,而AggregatingMergeTree则可以指定各种聚合函数。
-- 对某些字段需要进行聚合时,需要在创建表字段时指定成AggregateFunction类型
-- 在写入数据时,需要调用 *-State 函数
-- 查询数据时,则需要调用相应的 *-Merge 函数
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = AggregatingMergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[TTL expr]
[SETTINGS name=value, ...];-- 测试 创建聚合表 这种方式很麻烦
create table t_aggregating_mt(
id UInt8,
name String,
age UInt8,
loc String,
dept String,
workdays UInt8,
salary AggregateFunction(sum,Decimal32(2))
) engine = AggregatingMergeTree()
order by (id,age)
primary key id
partition by loc;insert into t_aggregating_mt select 1,'张三',18,'北京','java',18,sumState(toDecimal32(10000,2));
insert into t_aggregating_mt select 2,'李四',19,'上海','java',22,sumState(toDecimal32(8000,2));
insert into t_aggregating_mt select 3,'王五',20,'北京','java',26,sumState(toDecimal32(12000,2));select * ,sumMerge(salary) from t_aggregating_mt group by id,name ,age, loc,dept,workdays,salary ;
insert into t_aggregating_mt select 1,'张三三',18,'北京','前端',22,sumState(toDecimal32(5000,2));optimize table t_aggregating_mt;
select *,sumMerge(salary)  from t_aggregating_mt group by id,name ,age,loc,dept,workdays,salary;-- 测试创建物化视图
-- 创建表 t_merge_base 表,使用MergeTree引擎
create table t_merge_base(
id UInt8,
name String,
age UInt8,
loc String,
dept String,
workdays UInt8,
salary Decimal32(2)
)engine = MergeTree()
order by (id,age)
primary key id
partition by loc;-- 创建物化视图 view_aggregating_mt ,使用AggregatingMergeTree引擎
create materialized view  view_aggregating_mt
engine = AggregatingMergeTree()
order by id
as select
id,
name,
sumState(salary) as ss
from t_merge_base
group by id ,name;-- 向表 t_merge_base 中插入数据
insert into t_merge_base values (1,'张三',18,'北京','大数据',24,10000),
(2,'李四',19,'上海','java',22,8000),
(3,'王五',20,'北京','java',26,12000);-- 查看 view_aggregating_mt视图数据
select *,sumMerge(ss)  from view_aggregating_mt group by id,name,ss;-- 继续向表 t_merge_base中插入排序键相同的数据
insert into t_merge_base values (1,'张三三',18,'北京','前端',22,5000);-- 手动执行optimize 命令,合并物化视图 view_aggregating_mt 相同分区数据
optimize table view_aggregating_mt;--查询视图 view_aggregating_mt数据
select *,sumMerge(ss)  from view_aggregating_mt group by id,name,ss;-- 注意:通过普通MergeTree表与AggregatingMergeTree物化视图结合使用,MergeTree中存放原子数据,物化视图中存入聚合结果数据,可以提升数据查询效率。

CollapsingMergeTree表引擎 - 乱序写入无法实现折叠删除功能

-- CollapsingMergeTree就是一种通过以增代删的思路,支持行级数据修改和删除的表引擎。
-- 它通过定义一个sign标记位字段,记录数据行的状态。
-- 如果sign标记为1,则表示这是一行有效的数据;
-- 如果sign标记为-1,则表示这行数据需要被删除。
-- 当CollapsingMergeTree分区合并时,同一数据分区内,sign标记为1和-1的一组数据会被抵消删除。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
sign Int8
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...];--存在的问题:-- CollapsingMergeTree对于写入数据的顺序有着严格要求,否则导致无法正常折叠。
--数据折叠保留规则:-- 在同一个分区内order by 字段相同的数据存在多条,且sign值不同,数据保留规则如下:-- 1)如果sign=1和sign=-1的行数相同并且最后一行数据sign=1,则保留第一行sign=-1的行和最后一行sign=1的行。-- 2)如果sign=1的行比sign=-1的行多,则保留最后一条sign=1的行。-- 3)如果sign=-1的行比sign=1的行多,则保留第一条sign=-1的行。-- 4)其他情况,不保留数据。  -- 按照顺序写入需要更新或删除的数据-- 创建表 t_collapsing_mt ,使用CollapsingMergeTreecreate table t_collapsing_mt(id UInt8,name String,loc String,login_times UInt8,total_dur UInt8,sign Int8)engine = CollapsingMergeTree(sign)order by (id,total_dur)primary key idpartition by loc;--向表   t_collapsing_mt 中插入以下数据:insert into t_collapsing_mt values(1,'张三','北京',1,30,1),(2,'李四','上海',1,40,1);--查看表 t_collapsing_mt中的数据select * from t_collapsing_mt;-- 向表 t_collapsing_mt中继续插入一条数据,删除“张三”数据insert into t_collapsing_mt values(1,'张三','北京',2,30,-1);-- 查询表 t_collapsing_mt 中的数据 select * from t_collapsing_mt;-- 手动触发 optimize 合并相同分区数据optimize table t_collapsing_mt;-- 查询表 t_collapsing_mt 中的数据 select * from t_collapsing_mt;-- 插入以下两条数据,来更新 “李四”数据insert into t_collapsing_mt values(2,'李四','上海',1,40,-1),(2,'李四','上海',2,100,1);-- 查询表 t_collapsing_mt 中的数据 select * from t_collapsing_mt;-- 手动执行 optimize 触发相同分区合并optimize table t_collapsing_mt;-- 查看表 t_collapsing_mt中的数据select * from t_collapsing_mt;--注意:以上功能使用 collapsingMergeTree实现了分区合并。-- 乱序写入需要更新或删除的数据--删除表 t_collapsing_mt ,重新创建表 t_collapsing_mtdrop table t_collapsing_mt;create table t_collapsing_mt(id UInt8,name String,loc String,login_times DateTime,total_dur UInt8,sign Int8)engine = CollapsingMergeTree(sign)order by (id,total_dur)primary key idpartition by loc;--向表 t_collapsing_mt 中插入以下数据:insert into t_collapsing_mt values(1,'张三','北京',now(),30,-1);insert into t_collapsing_mt values(1,'张三','北京',now(),30,1);insert into t_collapsing_mt values(2,'李四','上海',now(),40,1);insert into t_collapsing_mt values(2,'李四','上海',toDateTime('2022-07-12 10:29:00'),40,-1);--查询表 t_collapsing_mt中的数据select * from t_collapsing_mt;--手动执行 optimize 命令,合并相同分区数据optimize table t_collapsing_mt;--查询表 t_collapsing_mt表中的数据,数据没有变化select * from t_collapsing_mt;-- 注意:当数据插入到表中的顺序标记如果不是1,-1这种顺序时,合并相同分区内的数据不能达到修改和更新效果。
-- 如果数据的写入程序是单线程执行的,则能够较好地控制写入顺序;如果需要处理的数据量很大,数据的写入程序通常是多线程执行的,那么此时就不能保障数据的写入顺序了。在这种情况下,CollapsingMergeTree的工作机制就会出现问题。但是可以通过VersionedCollapsingMergeTree的表引擎得到解决。

VersionedCollapsingMergeTree表引擎 - 版本折叠功能

-- 对数据写入顺序没有要求
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
sign Int8,
version UInt8
) ENGINE = VersionedCollapsingMergeTree(sign, version)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...];-- 例子
-- 创建表 t_version_collapsing_mt ,使用VersionedCollapsingMergeTree引擎
create table t_version_collapsing_mt(
id UInt8,
name String,
loc String,
login_times DateTime,
total_dur UInt8,
sign Int8,
version UInt8
) engine = VersionedCollapsingMergeTree(sign,version)
order by (id,total_dur)
primary key id
partition by loc;-- 向表 t_version_collapsing_mt 中插入以下数据
insert into table t_version_collapsing_mt values(1,'张三','北京',now(),30,-1,1),(2,'李四','上海',now(),40,1,2);-- 查询表 t_version_collapsing_mt 中的数据
select * from t_version_collapsing_mt;-- 向表 t_version_collapsing_mt中插入以下数据,删除“张三”信息,更新“李四”信息
insert into table t_version_collapsing_mt values(1,'张三','北京',toDateTime('2022-07-12 13:44:00'),30,1,1),(2,'李四','上海',toDateTime('2022-07-12 13:45:06'),40,-1,2),(2,'李四','上海',toDateTime('2022-07-12 13:47:00'),100,1,2);-- 查询表 t_version_collapsing_mt中的数据
select * from t_version_collapsing_mt ;-- 手动执行 optimize 命令,合并相同分区的数据,这里有可能需要执行多次
optimize table t_version_collapsing_mt;
-- 注意:如果不想执行多次,也可以执行 optimize table t_version_collapsing_mt final语句-- 查询表 t_version_collapsing_mt 中的数据如下:
select * from t_version_collapsing_mt;

Integration系列表引擎 - 与外部系统集成

HDFS 表引擎

-- HDFS 表引擎 ENGINE = HDFS(URI, format)-- 配置: hdfs-site.xml复制到/etc/clickhouse-server目录下, -- "export LIBHDFS3_CONF=/etc/clickhouse-server/hdfs-site.xml" 放入到 /etc/init.d/clickhouse-server-- format格式  format('hdfs://mycluster/path/file?','CSV') 或 format('hdfs://mycluster/path/*','JSON')create table t_hdfs(id UInt8,name String,age UInt8) engine = HDFS('hdfs://mycluster/ch/*.csv','CSV');-- 如果hdfs文件已存在,clickhouse就是只读-- 如果hdfs文件不存在,clickhouse就是允许查询和插入数据

MySQL表引擎

-- MySQL表引擎 映射MySQL的一张表,只能做查询和插入操作,不支持删除和更新操作CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...) ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);-- replace_query  - 将INSERT INTO 查询是否替换为 REPLACE INTO 的标志,默认为0,不替换。-- 当设置为1时,所有的insert into 语句更改为 replace into 语句。-- 当插入的数据有重复主键数据时,此值为0默认报错,此值为1时,主键相同这条数据,默认替换成新插入的数据。-- on_duplicate_clause - 默认不使用。当插入数据主键相同时,可以指定只更新某列的数据为新插入的数据
--在mysql 中创建一张表 t_ch,指定id为主键CREATE TABLE `t_ch` (`id` Int,`name` varchar(10) NOT NULL DEFAULT '',`age` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;--向表中增加一些数据insert into  t_ch values (1,'张三',18),(2,'李四',19),(3,'王五',20);--在ClickHouse中创建MySQL引擎表 t_mysql_enginecreate table t_mysql_engine (id UInt8,name String,age UInt8)engine = MySQL('192.168.7.17:3306','chauncy','t_ch','meifute','meifute');--查询ClickHouse表 t_mysql_engine 中的数据:select * from t_mysql_engine;-- 在ClickHouse中向表 t_mysql_engine中插入一条数据insert into t_mysql_engine values (4,'马六','21');--在ClickHouse中向表 t_mysql_engine中再插入一条数据,这里主键重复,报错。insert into t_mysql_engine values (4,'田七','22');--Exception: mysqlxx::BadQuery: Duplicate entry '4' for key 'PRIMARY' (node2:3306).-- 注意:在clickhouse 中 t_mysql_engine表不会在ClickHouse服务器节点上创建数据目录。
-- 测试replace_query
-- replace_query  - 将INSERT INTO 查询是否替换为 REPLACE INTO 的标志,默认为0,不替换。
--在mysql 中删除表 t_ch,重新创建,指定id为主键
CREATE TABLE `t_ch` (`id` Int,`name` varchar(10) NOT NULL DEFAULT '',`age` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 向表中增加一些数据
insert into  t_ch values (1,'张三',18),(2,'李四',19),(3,'王五',20);--在ClickHouse中删除MySQL引擎表 t_mysql_engine,重建
create table t_mysql_engine (id UInt8,name String,age UInt8)engine = MySQL('192.168.7.17:3306','chauncy','t_ch','meifute','meifute',1);-- 查询ClickHouse表 t_mysql_engine 中的数据:
select * from t_mysql_engine;-- 在ClickHouse中向表 t_mysql_engine中插入一条数据,主键重复。这里由于指定了replace_query = 1 ,所以当前主键数据会被替换成新插入的数据。
insert into t_mysql_engine values (3,'马六','21');-- 查询ClichHouse t_mysql_engine表数据
select * from t_mysql_engine;
-- 测试 on_duplicate_clause
-- on_duplicate_clause - 默认不使用。当插入数据主键相同时,可以指定只更新某列的数据为新插入的数据
--在mysql 中删除表 t_ch,重新创建,指定id为主键
CREATE TABLE `t_ch` (`id` Int,`name` varchar(10) NOT NULL DEFAULT '',`age` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 向表中增加一些数据
insert into  t_ch values (1,'张三',18),(2,'李四',19),(3,'王五',20);--在ClickHouse中删除MySQL引擎表 t_mysql_engine,重建
create table t_mysql_engine (id UInt8,name String,age UInt8)engine = MySQL('192.168.7.17:3306','chauncy','t_ch','meifute','meifute',0,'update age = values(age),name = values(name)');-- 查询ClickHouse表 t_mysql_engine 中的数据:
select * from t_mysql_engine;-- 在ClickHouse 中向表 t_mysql_engine中插入一条数据
insert into t_mysql_engine values (4,'马六1','21');-- 在ClickHouse中向表 t_mysql_engine中插入一条数据,主键重复。
insert into t_mysql_engine values (4,'田七','100');-- 查询ClichHouse t_mysql_engine表数据
select * from t_mysql_engine;

Kafka表引擎

-- 对应创建的表不会将数据存入ClickHouse中,这里这张kafka引擎表相当于一个消费者,消费Kafka中的数据,
-- 数据被查询过后,就不会再次被查询到。CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = Kafka()
SETTINGSkafka_broker_list = 'host:port',kafka_topic_list = 'topic1,topic2,...',kafka_group_name = 'group_name',kafka_format = 'data_format'[,]
-- Kafka 表引擎例子 一次性消费,无法查看已消费数据
-- 创建表 t_kafka_consumer ,使用Kafka表引擎
create table t_kafka_consumer (
id UInt8,
name String,
age UInt8
) engine = Kafka()
settings
kafka_broker_list='node03:9092,node04:9092,node05:9092',
kafka_topic_list='ck-topic',
kafka_group_name='group1',
kafka_format='JSONEachRow';-- 启动kafka,在kafka中创建ck-topic topic,并向此topic中生产以下数据:
-- 创建topic:
kafka-topics.sh \
--zookeeper node03:2181,node04:2181,node05:2181/kafka \
--create \
--replication-factor 3 \
--partitions 3 \
--topic ck-topic \
--config retention.ms=10800000生产数据:
kafka-console-producer.sh --broker-list node03:9092,node04:9092,node05:9092 --topic ck-topic
生产数据如下:
{"id":1,"name":"张三","age":18}
{"id":2,"name":"李四","age":19}
{"id":3,"name":"王五","age":20}
{"id":4,"name":"马六","age":21}
{"id":5,"name":"田七","age":22}消费者:
kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic ck-topic \
--from-beginning
查看消费情况:
kafka-consumer-groups.sh --bootstrap-server node03:9092,node04:9092,node05:9092 --list
kafka-consumer-groups.sh --bootstrap-server node03:9092,node04:9092,node05:9092 --describe --group 'console-consumer-91542'--在ClickHouse中查询表 t_kafka_consumer数据,可以看到生产的数据
select * from t_kafka_consumer;-- 注意:再次查看表 t_kafka_consumer数据 ,我们发现读取不到任何数据,这里对应的ClikcHouse中的Kafka引擎表,只是相当于是消费者,消费读取Kafka中的数据,数据被消费完成之后,不能再次查询到对应的数据。
-- 可以使用物化视图
-- 将Kafka中topic中的数据持久化到ClickHouse中,我们可以通过物化视图方式访问Kafka中的数据-- 1)创建Kafka 引擎表,消费kafka中的数据。-- 2)再创建一张ClickHouse中普通引擎表,这张表面向终端用户查询使用。这里生产环境中经常创建MergeTree家族引擎表。-- 3)创建物化视图,将Kafka引擎表数据实时同步到终端用户查询表中。--在ClickHouse中创建 t_kafka_consumer2 表,使用Kafka引擎
create table t_kafka_consumer2 (
id UInt8,
name String,
age UInt8
) engine = Kafka()
settings
kafka_broker_list='node03:9092,node04:9092,node05:9092',
kafka_topic_list='ck-topic',
kafka_group_name='group2',
kafka_format='JSONEachRow';--在ClickHouse中创建一张终端用户查询使用的表,使用MergeTree引擎
create table t_kafka_mt(id UInt8,name String,age UInt8) engine = MergeTree()order by id;--创建物化视图,同步表t_kafka_consumer2数据到t_kafka_mt中
create materialized view  view_consumer to t_kafka_mt
as select id,name,age from t_kafka_consumer2;
--注意:物化视图在ClickHouse中也是存储数据的,
--create  materialized view  view_consumer to t_kafka_mt语句
--将物化视图view_consumer中的数据存储到到对应的t_kafka_mt 表中,
-- 这样同步的目的是如果不想继续同步kafka中的数据,可以直接删除物化视图即可。-- 启动kafka,在kafka中创建ck-topic topic,并向此topic中生产以下数据:
-- 创建topic:
kafka-topics.sh \
--zookeeper node03:2181,node04:2181,node05:2181/kafka \
--create \
--replication-factor 3 \
--partitions 3 \
--topic ck-topic \
--config retention.ms=10800000生产数据:
kafka-console-producer.sh --broker-list node03:9092,node04:9092,node05:9092 --topic ck-topic
生产数据如下:
{"id":1,"name":"张三","age":18}
{"id":2,"name":"李四","age":19}
{"id":3,"name":"王五","age":20}
{"id":4,"name":"马六","age":21}
{"id":5,"name":"田七","age":22}消费者:
kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic ck-topic \
--from-beginning
查看消费情况:
kafka-consumer-groups.sh --bootstrap-server node03:9092,node04:9092,node05:9092 --list
kafka-consumer-groups.sh --bootstrap-server node03:9092,node04:9092,node05:9092 --describe --group 'console-consumer-91542'--在ClickHouse中查询表 t_kafka_consumer数据,可以看到生产的数据
select * from t_kafka_consumer2; -- 没有数据时,查询会很慢--查询表 t_kafka_mt中的数据,数据同步完成。
select * from t_kafka_mt;

ClickHouse安装与引擎相关推荐

  1. clickhouse安装_初识ClickHouse——安装与入门

    前言: 久闻 ClickHouse 大名,一直没有去详细了解.近期看了下 ClickHouse 相关文档,决定安装体验下.想了解 ClickHouse 的小伙伴可以一起跟着学习哦.本篇文章主要介绍 C ...

  2. 大数据之clickhouse安装部署

    一.clickhouse简介 ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(D ...

  3. 初识Clickhouse 安装与部署(一)

    初识Clickhouse 安装与部署(一) 一.简介 1.1 特性 1.2 限制 二.安装与部署 2.1 环境要求 2.2 版本选择及下载 2.3 安装 2.4 Clickhouse目录结构 2.5启 ...

  4. ClickHouse安装使用Centos7环境

    前言 列式存储数据库DBMS,比MySQL等面向行的数据库有查询优势,同时又比同样属于面向列DBMS的更有效的节省空间(不适用固定大小存储数据),使用数据压缩后,可以传输更多,延迟小等. 提示:以下是 ...

  5. mysql 表引擎无法更新_Mysql安装archive引擎更新表引擎

    1,在mysql命令行中安装Archive引擎 1,查找mysql plugins lib目录,看目录中是否存在Archive的so; mysql > show variables like'p ...

  6. clickhouse的ReplacingMergeTree引擎实战

    学习ReplacingMergeTree引擎,首先你得了解clickhouse的MergeTree引擎,因为ReplacingMergeTree引擎是MergeTree引擎的一个扩展版引擎,他拥有和M ...

  7. Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1729858 虽然 ...

  8. 【clickhouse】Clickhouse的MySQL引擎同步数据不准确 Decimal

    文章目录 1.概述 2. 场景2 2.1 概述 1.概述 我想从MySQL同步数据到Clickhouse,但是发现Clickhouse的MySQL引擎同步数据不准确,精度丢失而且还是不对的.(很多数据 ...

  9. 【clickhouse】MergeTree引擎的固定/自适应索引粒度

    文章目录 1.概述 2.固定索引粒度 3.自适应索引粒度 1.概述 转载:聊聊ClickHouse MergeTree引擎的固定/自适应索引粒度 我们在刚开始学习ClickHouse的MergeTre ...

  10. Percona Server for MySQL 安装TokuDB引擎

    Percona Server for MySQL 安装TokuDB引擎 TokuDB主要优点:insert数据比Innodb快的多,数据压缩比要Innodb高 官方文档https://docs.per ...

最新文章

  1. OpenResty+Keepalived组建高可用集群+双主模式
  2. Node.js进击基础一(5-11事件模块)
  3. 数学问题——最大公约数与最小公倍数
  4. 嵩天python笔记_第一篇python笔记
  5. matlab文件批量导入问题总结
  6. 在 docker中 运行 mono /jexus server 并部署asp.net mvc站点
  7. MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式
  8. Stanford Local Programming Contest 2011
  9. 1600802047 android 第三次作业(音乐播放器)
  10. 医用口罩、N95、KN95口罩的区别
  11. 备份数据 宝塔linux_华为云服务器安装宝塔Linux面板及宝塔面板数据库备份导入体验...
  12. HarmoneyOS鸿蒙系统零代码编程入门
  13. 用友U8 13.0运维及操作手册全版
  14. eclipse:STS下载使用(STS(Spring Tool Suite)其实是个被包装过的eclipse)
  15. C1驾考 科目二 (超详细!文字+实拍图)
  16. 数据库系统概念第六版 第八章练习题 2 3 9
  17. Android如何关闭硬件加速
  18. 手机QQ怎么使用群签到
  19. W806/W801/W800多通道ADC同时使用
  20. 详细设计-程序结构图

热门文章

  1. LoadRunner教程(7)-LoadRunner 创建测试场景
  2. StretchDIBits
  3. [系统安全] 十七.Windows PE病毒概念、分类及感染方式详解
  4. c语言编写词库_藏拙简易中文分词服务器(C语言开发+词库+源代码)
  5. 如何利用SOLIDWORKS BOM生成材料明细表
  6. 易语言 html 替换全角 半角,易语言全角与半角转换的使用讲解
  7. 深度linux使用入门教程,Linux初级使用指南
  8. copy和strong的区别
  9. 获取人脸图片和训练人脸
  10. Android 使用OPENCV实现图像实时对比