clickhourse是一个真正意义上的列式存储数据库,传统数据库存储数据都是按照数据进行存储 表代表着目录 列是一个文件
Mysql 是行式存储,保证数据的完整性
行列的区别
oltp的事务计算
ll |grep click 查看开启的命令
cd /etc/clickhouse-server/里面是click的核心配置文件
cd /var/lib/clickhouse/ 数据的目录
里面有核心数据库 data(存数据) metadata(数据库,表)
/var/log/clickhouse-server/ 排查错误日志
-h 访问哪一个机械
clickhouse端口8123
Mysql 9004
Postgresql 9005
单机模式远程连接外机
Clickhouse -h slave01
Clickhouse-client -h slave01
Clickhouse 效率问题 引擎很强大
Clickhouse 建库
CREATE DATABASE test 创建数据库
Show create database test;查看数据库
Atomic 默认库的引擎
查看数据类型库 less
test.sql
Store 存储
quit;退出
Mysql 库引擎,clickhouse 本身并不存储数据,只是将请求转发到mysql,同样,
Clickhouse 还提供了针对 postgresql ,sqllite 的库引擎
关注experimental sql
数据类型
clickhouse的极简化在基础数据类型中体现得尤为明显
Int8-[-128:127 ] 占用8个字节,对应java中的byte
Int16-[-32768:32767] 占用16个字节,对应java跟踪的short
Int32-占用32个字节,对应java中的int
Int64-占用64个字节,对应java中的long
无符号整形范围
UINT8-[0:255]
UINT16-[0:255]
UIN32-[0:255]
UIN64-[0:255]
Boolean
Clickhouse 没有定义表示true 和 false的布尔类型的数据,通常都是直接用使用UInt8
浮点型 (精度有丢失)
Float32 -float
Float64 -double
解决办法(Decimal型(有符号的浮点数))三种声明:Decimal32(s)Desimal64(s)后面的 s 表示小数点后的数字位数,前面的32表示浮点精度,决定可以有多少个十进制数字(包括小数位),也就代表不同的取值范围
字符串型
clickhouse字符型数据使用string进行声明 字符串可以是任意长度,没有编码的概念,字符串可以是任意的字符集,比如 lengthUTF8函数是假设字符串以UTF8编码,计算的字符串包含的 Unicode子字符的长度
还有一个固定长度的字符串类型FixedString(N)这个 N 就是要声明的字节数,如果字符串包含的字节数不足N,将会对字符串末尾进行空字节填充,如果字符串包含的字节数大于 N ,将会抛出异常,可以用来保存一些列如手机号码,IP地址这一类等长的规范数据,在实际开发中使用比较少
枚举类型 (-m支持多行的参数)
包含 Enum8 和 Enum
Clickhouse 插入的时候要(),(),()一批一批的插入,为了更好的保证原子性
Cast (x, "Int8") 说明了key只是表面的,底层存储的就是 对应Int8的值,也就是数字
优点:不用维护字典表
数组类型
类型声明:array(T),表示一个有T类型元素组成的数组,T可以是任意类型,甚至也可以是数组类型,但是不建议使用多位数组,clickhouse对多维数组的支持有限,列如在MergeTree引擎中就不能存储多维数组
时间类型
有三种数据类型
Data 可以节后一个年月日格式的字符串,列如201-10-13
Datatime 可以接收一个年月日时分秒格式的字符串列如2021-10-13 20:50:10.232
Datatime64 可以接受一个年月日时分秒,毫秒格式的字符串,列如2021-10-13 20:50:10.232
可为空类型
可以在前面的字段加上Nullable (Int8), 对于整数类型,-1可以代替空 不建议使用
UUID 产生是无序,建议是有序的
MergeTree(核心)(合并数,适用于高负载任务的最通用和功能最强大的表引擎)
就像mysql提供lnnodb和myisam等等多种数据引擎来对表进行管理一样
Replicated 表示在另一台机器上存储一个副本
日志 最小功能的轻量级引擎(练习,日志)
集成引擎 用于与其他的数据存储与处理系统集成的引擎
尽量不要产生虚拟列,如果有的话,可以 提前处理好当成字段,做个宽表
MergeTree
- Partition by
概念:合并 LSM hbase中提到过 直接写到内存 查询相对比较慢 基于olap的这个场景
合并的时机:在后台执行一次合并的操作
手动合并:optimize table 表名 final;业务夜晚定时合并
2.order by排序键(有序保存)
3.primary key (主键) 并不要求数据唯一性 相当于对排序再做了一个索引
索引粒度并不能决定你数据的分布情况
clickhouse中的主键相当于给主键列的数据建立了一级索引,而实际上,在一级索引的基础上,clickhouse还提供了二级索引的功能,相当于给一级索引再建立一个索引,二级索引的目的同样也是为了加快数据检索速度
明确的说是把一级索引再优化合并成二级索引,同样也是更快的加快数据检索速度
布隆过滤器也可以 建立一个集合,把集合全部传进去然后比较
TTL 数据存活时间 (可以用来指定行存储的持续时间)字段和表都可以用
MergeTree可以针对表或者列声明数据存活时间
注意列式 TTL 不能用于主键 很好理解,数据删了,那我
索引怎么办
用法:只能够表示存活多长时间
这里是定义clickhouse如何移除过期数据
Delete -删除过期的行 默认行为
TO DISK 'aaa' 将数据块移动到磁盘 ‘aaa’
TO VOLUME 'bbb' 将过期的数据块移动到卷 'bbb' 将远程的目录挂在卷里面,是不是就可以远程的文件共享了 就是把虚拟的磁盘挂到卷里面
GROUP BY 聚合过期的行
后面的 where 可以指定哪些过期的行为会被删除或聚合(不适合用于数据移动)
SAMPLE BY 数据抽样
数据抽样同样用于大数据分析, 可以极大提升数据分析的性能,采用修饰符只能用在MergeTree的表中才有效,并且抽样表达式指定的列,必须包含在主键中,进行了采样声明后,就可以在查询时进行采样查询 10%