type
status
date
slug
summary
tags
category
icon
password
ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
安装准备
- 关闭防火墙
sudo systemctl close firewalld
- 取消打开文件数的限制
分别在/etc/security/limits.conf和/etc/security/limits.d/20-nproc.conf中加入如下代码,并分发到其他主机上
- 在几台主机上安装依赖
sudo yum install -y libtool
sudo yum install -y *
unixODBC
*
- 取消selinux,修改/etc/selinux/config中的
SELINUX=disabled
, 并同步给其他电脑。
- 重启几台服务器
单机安装
- 在hadoop102的/opt/software下创建clickhouse目录
mkdir /opt/software/clickhouse
- 上传安装文件并同步到其他机器上
- 在三台机器上执行安装命令
sudo rpm -ivh *.rpm
- 修改配置文件
sudo vim /etc/clickhouse-server/config.xml
并分发,打开
<listen_host>::</listen_host>
,让clickhouse可以被除本机外的其他服务器访问在这个文件中,有ClickHouse的一些默认路径配置,比较重要的
数据文件路径:<path>/var/lib/clickhouse/</path>
日志文件路径:<log>/var/log/clickhouse-server/clickhouse-server.log</log>
- 关闭三台机器上的开机自启
sudo systemctl disable clickhouse-server
,启动serversudo systemctl start clickhouse-server
- 使用client连接server
clickhouse-client -m
数据类型(基本)
- 整型
- 浮点型
- 布尔型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。

- Decimal型
- 字符串
- 枚举类型
- 时间类型
- 数组
表引擎
表引擎是clickhouse的一大特色,可以说,表引擎决定了如何存储表的数据,包括:
- 数据的存储方式和位置,写到哪里以及从哪里开始读取数据
- 支持哪些查询以及如何支持
- 并发数据访问
- 使用索引(如果存在)
- 是否可以执行多线程请求
- 数据复制参数
表引擎的使用方式就是必须显式在创建表的时候定义该表使用的引擎,以及引擎使用的相关参数,特别注意,引擎的名称大小写敏感
- TinyLog
以列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量数据的小表,生产环境上作用有限。可以用于平时练习测试用。
create table t_tinylog ( id String, name String)
engine=TinyLog
;
- Memory
内存引擎,数据以未压缩的原始方式直接保存在内存中, 服务器重启数据就会小时,读写操作不会相互阻塞,不支持索引,简单查询下有非常高的性能表现。除了用于需要高性能,数据量又不是特别大的测试外,一般没有什么应用场景。
- MergeTree
clickhouse最强大的表引擎,支持索引和分区,地位和mysql的innodb相当。并且基于MergeTree,还有其他特色的衍生引擎
MergeTree其实还有很多参数,但是这三个参数是更重要的
partition by 分区目的是降低扫描范围,优化查询的进度。如果不配置各个参数的话,只会使用一个分区。
MergeTree是以列文件+索引文件+表定义文件组成的,如果设定了分区,这些文件就会保存到不同的分区目录里面
并行:分区后,面对设计跨分区的查询统计,ClickHouse会以分区为单位为进行处理
数据写入和分区合并,任何一个频次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区,写入后的某个时刻,ClickHouse会自动执行合并操作(也可以通过手动命令合并
optimize table xxxx final
;) clickhouse中的primary key主键和其他数据库不太一样,他只提供了数据的一级索引,但是不是唯一约束。这意味着可以存在相同primary key的数据
主键的设定主要依据查询语句中的where条件。
根据条件对主键进行二分查找,能够尽快定位到对应的索引粒度,避免了全表扫描。clickhouse中mergeTree的默认索引粒度是8192。除非该列中存在大量重复值,不然官方不建议修改这个值
这里的二分查找使用了稀疏索引

稀疏索引的好处是可以用很少的索引数据,去定位更多的数据,代价是只能定位到索引粒度的第一行,然后再开始逐行查找
order by 设定了分区内的数据按照哪些字段顺序进行有序保存,order by是MergeTree中唯一一个必填项,甚至比primary key还重要,因为当用户不设置主键的情况,很多处理会按照order by的字段进行处理。(后面的去重和汇总)
主键必须是order by字段的前缀字段。否则索引会失效,因为索引是按照二分查找,无序的话就无法使用二分查找。
比如order by 字段是 (id,sku_id) 那么主键必须是id 或者(id,sku_id)
- 作者:tacjin
- 链接:http://jin.wiki/article/247f97b4-1a92-4134-af3f-6dbda86b052b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。