version=19.4
https://clickhouse.yandex/docs/v19.4/en/operations/table_engines/mergetree/
主键越多影响插入时的性能和内存消耗,但不影响查询性能
主键与分片键的关系
- 主键用于在同一个分片内的排序
- 分片键决定数据在哪个分片
数据粒度:创建索引时每个标记(mark)之间的数据数量,每个固定数据粒度会有一个标记。比如100个数据,数据粒度是10,则每隔10个数据会有一个标记
主键与排序列之间的关系
- 主键首先排序再按照排序列排序
本地表与分布式表
- 只在当前服务器创建。需要在所有服务器都创建才能在所有服务器都有效。通常用_local后缀标记本地表,但不强制
- 在本地表基础上创建的表,本身不存储数据,用于路由与合并。通常用_all后缀标记分布式表,但不强制
命令行方式执行脚本文件
clickhouse-client —host=$HOSTNAME —port=53090 —multiquery < createtable.new.sql
clickhouse-client —port=53090 —mn < createtable.new.sql导入csv数据,指定分隔符
clickhouse-client —format_csv_delimiter=”|” —query=“INSERT INTO test.csv FORMAT CSV” < data.csv
脚本文件中“—”表示注释
ReplacingMergeTree 表引擎,会删除相同主键的数据
1.只能根据主键去重。
2.去重的时候只会去重相同分区的数据,跨分区不会去重,即使是使用 OPTIMIZE TABLE table1 FINAL 也不会跨分区去重。
如果一定要使用这个特性去重,只能将需要去重的数据放在同一个分区。(分区键为主键之一的时候不存在这个问题)
https://www.jianshu.com/p/a5bf490247eaOPTIMIZE语法
OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition] [FINAL]
initializes a non-scheduled merge of data parts
If you specify FINAL , optimization will be performed even when all the data is already in one part
- 对本地表有效,对分布式表无效,但可以通过 ON CLUSTER cluster使整个集群有效删除指定分区
ALTER TABLE tablex [ON CLUSTER rpp] drop partition toYYYYMMDD(toDate(‘2019-07-11’));
ALTER TABLE tablex [ON CLUSTER rpp] drop partition 20190711;
- 对本地表有效,对分布式表无效,但可以通过 ON CLUSTER cluster使整个集群有效如何去重
- 使用ReplacingMergeTree引擎
- 分片字段必须包含在主键中
- sharding key表达式必须与分片表达式一致(optimize只能在相同shard中根据主键去重)
为了一致,需要尽量将分片的表达式表示成整数,因为分布式表中的sharding_key只支持整数
- 重跑作业完成后必须对生成数据所在的分片进行optimize去重
- 查询数据方可以使用optimize语句针对所要查询的分片进行去重【可选,但是不建议】
- Distributed(remote_group, database, table [, sharding_key]) 创建分布式表时,sharding_key不能用随机数表示,需要用主键中的列表示才能将相同主键的数据保存到相同的shard
数据复制
数据复制时表级别的,不是服务器级别的。
查看当前有几个集群:
select * from system.clusters;\G数据导入
clickhouse-client —port 53090 —query=”INSERT INTO database.table FORMAT TabSeparated” < xxx.csv
cat /ratings.csv | clickhouse-client —port 53090 —query=”INSERT INTO test FORMAT CSV”;
cat /ratings.csv | clickhouse-client —port 53090 —query=”INSERT INTO test FORMAT TabSeparated”;
—- 通过HTTP接口导入(TSV格式,未压缩)
curl -X POST -sS ‘http://localhost:53091/?query=INSERT%20INTO%20rlog.qlog%20FORMAT%20TabSeparated’ —data-binary ‘@2015-09-30@qlog.log’
curl -X POST -sS ‘http://ch30-sq.gdp.haplat.net:53091/?query=INSERT%20INTO%20com_cnc_rpp.test%20FORMAT%20TabSeparated’ —data-binary ‘@test.data’
curl -X GET -sS ‘http://ch30-cz.gdp.haplat.net:53091/?query=SELECT%20dt%20FROM%20com_cnc_rpp.test%20limit%202’
—- 通过HTTP接口导入(TSV格式,gzip压缩)
curl -X POST -sS -H “Content-Encoding: gzip” ‘http://localhost:53091/?query=INSERT%20INTO%20rlog.qlog%20FORMAT%20TabSeparated’ —data-binary @1.log.gz
数组格式(arr Array(String))需要用单引号: [‘a’,’b’,’c’]
数组格式(arr Array(UInt8))需要用单引号: [1,2,3]
数组格式(arr Nested(x String,y UInt8): [‘a’,’b’] [1,2] —- 相当与定义了两个数据arr.x arr.y,但是两个数据的大小必须一样