Clickhouse入门学习
一、理论知识
1.什么是Clickhouse
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),不单单是数据库。
2.为什么用Clickhouse
因为他快,小量数据使用传统的MySQL进行CRUD特别是查询是没有问题的。但是现在互联网发展至今,数据量呈指数增加。数据条数动不动就超过亿条。及时关系型数据库加上索引以及数据库查询优化,查询速度还是慢。所以针对此类情况,Clickhouse就应运而生。
因为列式存储+特定的算法使clickhouse快。
3.Clickhouse的引擎
1.数据库引擎:MySQL
他是用来将MySQL数据库映射到Clickhouse中,个人测试,Clickhouse-MySQL引擎查询速度跟MySQL差不多,甚至不如MySQL。
2.表引擎:MergeTree Family
有以下七种:
Mergetree(父类,下面都是MergeTree的子类)
AggregatingMergeTree聚合
ReplacingMergeTree
GraphiteMergeTree石墨
CollapsingMergeTree崩溃
SummingMergeTree
VersionedCollapsingMergeTree
二、实践操作
1.安装
docker安装/linux安装(略)
2.linux如何登陆clickhouse
#max_memory_usage 不考虑内存,如果内存不足,会崩溃
clickhouse-client --host 192.168.0.70 --port 8123 --max_memory_usage=0
3.Clickhouse支持的第三方客户端
redash(web),DBeaver(客户端)等。
4.常用引擎
1.Mergetree
分块保存,然后在后台按规则合并,合并时没有数据丢失(不会删除重复行)
2.AggregatingMergeTree聚合
分块保存,然后在后台按规则合并,合并时会将数据进行去重(一般会有聚合函数,an聚合函数规则进行计算,多行合并为一行),常用来监视其他表的实例化视图,依附于其他表(比如MergeTree存储数据,AggregatingMergeTree用来聚合数据,方便查询)。
3.ReplacingMergeTree
在排序时(建表语句中order by 后面的字段决定)会删除重复的条目,重复数据删除仅在合并期间发生。合并发生在后台的未知时间。
5.数据类型
注意:首字母大写,尽量按规范写,否则不识别
-
整型:UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64
-
浮点:Float32,Float64单精度/双精度(F大写)
-
精确计算:Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S)
-
布尔:用UInt8 0/1
-
字符串:String(注意S大写) FixedString(N)
-
UUID 16byte
-
时间:Date/DateTime/DateTime64
-
枚举:Enum
-
低基数:LowCardinality(data_type)
-
数组:array(T)
等,详细见官网(https://clickhouse.tech/docs/en/development/architecture/)
6.常见数据库操作
#查看表/数据库
show databases;
show tables from ch_test;
#创建表/数据库
create datebase ch_test;
CREATE TABLE ch_test.role2
(id String,
roleName String,
t datetime) ENGINE = MergeTree()
ORDER BY t
#删除表/数据库
drop database ch_test;
drop table ch_test.role;
#删除行数据(此处与mysql不同,ALTER TABLE并不是删除表,只是clickhouse特有的语法)
ALTER TABLE dwd.alarm_item_log delete WHERE alarm_name ='未知的错误类型'
#插入数据
insert into ch_test.role values(...),(...)
#创建视图(同mysql的view)
CREATE VIEW [view_name] ( 字段1 字段1类型,字段2 字段2类型 ) AS SELECT ...
#导入数据-Mysql 映射迁移
create database test_db ENGINE = MySQL('192.168.40.89:3306','remote_test','root','root')
#查询操作
select * from table where ... group by ... order by ...
#导入数据-外部文件(csv)导入
#1.建表
CREATE table xc_remote.sample( userid String, sampno UInt32, prjname String, type String, density Float64, rangup Float64, rangdown Float64, patientname String, patientsex String, patientage UInt16, patienttype String, testdate Datetime ) ENGINE=MergeTree() order by userid
#2.用DBeaver工具导入xc_remote.sample表中
#2.用select .. into ..
SELECT column1, column2, column3, ...
INTO newtable
FROM oldtable
WHERE condition;
#2.也可以用 linux TCP接口(官方航班数据)
xz -v -c -d < ontime.csv.xz | clickhouse-client --query="INSERT INTO ontime FORMAT CSV"