- ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS), 主要用于在线分析处理查询(OLAP), 能够使用SQL查询实时生成分析数据报告。
1、ClickHouse特性:真正的面向列的DBMS
以下表为例:
mysql中的表Student
- 在采用行式存储的数据库(例如mysql)中, 数据在磁盘上是一行一行存储的。这样存储的好处是想要查找某个学生的所有属性时,可以通过一次磁盘查找加顺序读取即可,但是当想要查所有人的年龄时,需要不停滴查找,或者全表扫描才行,遍历的很多数据都是不需要的。
- 而在采用列式存储时(例如clickhouse),数据是按照每一个字段在磁盘上建一个文件,所以当查询所有学生的年龄时,直接读取某一个文件即可。读取速度大大加快!
2、ClickHouse单机安装:略
3、ClickHouse单机命令行使用:clickhouse-client
- 常见参数
- --host,-h:服务端的host名称, 默认是localhost
- --port : 连接的端口,默认9000
- --user,-u:用户名
- --password:密码
- --query,-q:非交互模式下的查询语句
- --database, -d:默认当前操作的数据库。默认值default
- --multiline,-m:允许多行语句查询
- --format, -f:使用指定的默认格式输出结果
- --time,-t:非交互模式下回打印查询执行的时间到窗口
- --stacktrace:如果出现异常,会打印堆栈跟踪信息
- --config-file:配置文件名称
- 命令行上sql的使用
- show database;
- show tables;
4、ClickHouse分布式集群安装
- 第1步:安装3台单机模式的clickhouse
- 第2步:配置3台机器的config.xml,让他们互相知道对方的存在,然后组合成一个集群:
- 有一个配置:<listen_host>::</listen_host>
- 配这个的意思是:Listen specified host. use ::(wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 frm everywhere.
- 即:为了能让别的机器连接,配置成::即可
- 第3步:新建metrika.xml文件
5、启动集群
- 使用clickhouse-client 进入命令行
- select * from system.clusters 查询集群状态
6、ClickHouse数据类型
- 和其他数据库比较
MySQL | Hive | ClickHouse(区分大小写) |
---|---|---|
byte | tinyint | Int8 |
short | smallint | Int16 |
int | int | Int32 |
long | bigint | Int64 |
varchar | string | String |
timeestamp | timestamp | DateTime |
float | float | Float32 |
double | double | Float64 |
7、引擎
- 特性:表引擎(即表的类型)决定了:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持
- 并发数据访问
- 索引的使用(如果存在)
- 是否可以执行多线程请求
- 数据复制参数
- 引擎的分类:
- Log:
具有最小功能的轻量级引擎。当你需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。
- [TinyLog](tinylog/)
- [StripeLog](stripelog/)
- [Log](log/)
- MergeTree:
适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。 MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。
- 外部表引擎:
用于与其他的数据存储与处理系统集成的引擎。
- 用于其他特定功能的引擎:
7.1、 TinyLog
最简单的表引擎,用于将数据存储到磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加在文件的末尾。
- 该引擎没有并发控制:
- 如果同时从表中读取和写入数据, 则读取操作将抛出异常;
- 如果同时写入多个查询的表, 则数据将被破坏;
- 不支持索引:
- 这种表引擎的典型用法是write-once:只写入一次数据,然后根据需要多次读取。
- 此引擎适用于相对较小的表(建议最多1000000行)。
7.2、Memory
内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。
- 一般不会使用到这个引擎,除非是用来搞测试,或者需要非常非常高德性能,同时数据量又不太大(上线大概1亿行)的场景。
- 不支持索引(ps:数据已经在内存中了,速度已经很快了,所以无需索引)
7.3、Merge
Merge引擎本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。 读取时,那些呗真正读取到数据的表的索引(如果有的话)会被使用。
- Merge引擎的参数:一个数据库名和一个用于匹配表名的正则表达式。
- 类似于mysql的视图(view)
7.4、MergeTree(重要)
- ClickHouse中最强大的表引擎是MergeTree及该系列(*MergeTree)中的其他引擎。
- 允许你高效滴一批批写入数据片段,这些数据会在后台按照一定规则合并。
- 可以直接看官方文档(MergeTree)。
建表语句:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
7.5、Distributed
分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。 分布式引擎参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)