clickhouse简单使用及优化
clickhouse简单使用及优化
- 一、ClickHouse是什么?
- 二、特点
- 三、使用步骤
- 1.安装看官网
- 2.数据类型
- 3.命令行client操作
- 4.用户密码设置
- 5.表引擎
- 6.创建表
- 6.1创建普通表
- 6.2创建分布式表
- 三、同步mysql数据
- 优化策略
原来项目用mysql,随着数据量增加已不再适用(目前每周大约2亿数据),且这部分数据主要用于分析,不涉及更改,调研后迁移到clickhouse。
目前用了 22.3.3.44 版本。
一、ClickHouse是什么?
ClickHouse® 是一种用于在线分析处理 (OLAP) 的高性能、面向列的 SQL 数据库管理系统 (DBMS)。它既可以作为开源软件使用,也可以作为云产品使用。。
二、特点
- 列式存储,OLAP(On-line Transaction Processing)数据库
- 具备DBMS功能
- 适用于只插入数据不更改或者少量更改数据的场景(clickhouse更改数据是很重的操作)
- 并发低,qps默认为100
- 查询速度快,多线程查询(单条sql即可多线程查询)
- 稀疏索引
三、使用步骤
1.安装看官网
clickhouse官方文档
2.数据类型
看官网,他的文档感觉写的很好~

3.命令行client操作
# 登录,如果没有密码就空着
clickhouse-client --user default --password root
# 执行sql脚本
clickhouse-client --user default --password root --multiquery < /home/data/test_log.sql
4.用户密码设置
/etc/clickhouse-server/users.xml 文件中的users标签为用户,其中default代表用户名,这里我只用了default用户,可以添加其他用户
<users><default> <password_sha256_hex>4813494d137e1631bba301d5acab6e7bb7aa74ce1185d456565ef51d737677b2password_sha256_hex><networks><ip>::/0ip>networks><profile>defaultprofile><quota>defaultquota>default>users>
5.表引擎
clickhouse有多种表引擎,其中用的最多的为合并树,是clickhouse中最强大的表引擎,它是一个家族,其中有多种细分类别。
该系列中的引擎MergeTree设计用于将大量数据插入表中。数据快速逐个写入表,然后应用规则在后台合并各个部分。这种方式比insert时不断改写storage中的数据效率高很多。

6.创建表
6.1创建普通表
我主要用了MergeTree,以它为例:
CREATE table test_log(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
PRIMARY KEY id
ORDER BY id
- ENGINE- 引擎名
- ORDER BY — 排序键
- PARTITION BY — 分区键 ,可选项。
- PRIMARY KEY - 如果要 选择与排序键不同的主键,在这里指定,可选项。
6.2创建分布式表
单机难以接入这么多流量,目前这个项目可以指定每台设备接入哪些流量,所以只需要增加一个分布式表用于查询所有设备数据即可,不需要通过分布式表写入。
1.更改配置文件 config.xml 在<remote_servers></remote_servers>标签之间添加集群信息,重启clickhouse,集群信息例(我设置了免密登录,需要密码还要写密码,看官网):<!-- 测试集群 -->
<test_cluster><!-- 分片1 --><shard><replica><host>192.168.10.183</host><port>9000</port></replica></shard><!-- 分片2 --><shard><replica><host>192.168.10.184</host><port>9000</port></replica></shard>
</test_cluster>2.创建分布式表指定集群与服务器中的本地库名、表名,例:CREATE TABLE d_test_log (id UInt32,create_time Datetime
) ENGINE = Distributed(test_cluster, default, test_log);3.查询分布式表
select * from d_test_log limit 10;
三、同步mysql数据
CREATE TABLE log_mt ENGINE = MergeTree ORDER BY Id AS SELECT * FROM mysql('127.0.0.1:3306', 'test', 'test_log', 'root', 'root');
优化策略
- 查询时指定select的字段,只获取需要的,这样io少
- 批量插入,官方建议>1000
- 不要使用join,clickhouse的join会将右表完全加载到内存,建议将一类型业务放到一张宽表中,如果确实合不到一起可以拆表,然后进行2次查询,或者使用去重的表引擎等。
- 查询时尽量要指定时间,用PARTITION BY的字段
- 使用物化视图(一张表不要建立太多的物化视图,插入时会关联插入这些物化视图的数据)
- MergeTree设置冷热数据,将热数据放到固态盘中(冷热数据看官网的MergeTree引擎说明)
- 字段添加索引
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
