Clickhouse的特点

Clickhouse的特点

一,列式存储

Id Name Age
1 张三 18
2 李四 22
3 王五 34

采用行式存储时,数据在磁盘上的组织结构为:

1 张三 18 2 李四 22 3 王五 34

行式存储的好处:
想查找某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以;但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

采用列式存储时,数据在磁盘上的组织结构为:

1 2 3 张三 李四 王五 18 22 34

这时想查所有人的年龄只需要把年龄那一列拿出来就可以了

列式存储的好处:

  1. 对于列的聚合,计数,求和等统计操作原因优于行式存储;
  2. 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;
  3. 由于数据压缩比更好,一方面节省磁盘空间,另一方面对于cache也有了更大的发挥空间。
  4. 列式存储不支持事务

二、DBMS的功能

几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数;
用户管理及权限管理
数据的备份与恢复

三、多样化引擎

Clickhouse和mysql类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎;目前包括合并树,内存,文件,接口和其他六大类20多种引擎。

四、高吞吐写入能力

        Clickhouse采用类LSMTree结构,数据写入后定期在后台Compaction。通过类LSMtree的结构,Clickhouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在HDD上也有着优异的写入性能。
        官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度。

五、数据分区与线程级并行

Clickhouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity,然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。
在这种设计下,单条Query就能利用整机所有CPU;极致的并行处理能力,极大的降低了查询延时。
所以,Clickhouse即使对于大量数据的查询也能够化整为零平行处理;但是有一个弊端,就是对于单条查询使用多CPU,就不利于同时并发多条查询;所以对于高QPS的查询业务,Clickhouse并不是强项
即时查询ad-hoc很适合Clickhouse,BI工具,Echart
Redis是高QPS,ES,mysql的QPS也挺高;QPS:每秒的查询次数
Clickhouse像很多OLAP数据库一样,单表查询的数据优于关联查询,而且clickhouse的两者差距更为明显

数据类型

  • 固定长度的整型,包括有符号整型或无符号整型;

    Int8, Int16,Int32,Int64
    无符号整型范围
    UInt8,UInt16, UInt32, UInt64
    使用场景:个数,数量;也可以存储型id

  • 浮点型
    Float32 - float
    Float64 - double
    浮点型是用二进制方式存储的,会用误差,Decimal是用十进制方式存储的,不会有误差。
    不推荐使用浮点型,可以使用Decimal类型,精度更精准

    使用场景:一般数据值比较小,不涉及大量的统计计算,精度要求不高的时候;比如保存商品的重量。

  • 布尔型
    没有单独的类型来存储布尔值;可以使用UInt8类型,取值限制为0或1。

  • Decimal型
    有符号的浮点点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
    有三种声明:
    Decimal(p,s)
    Decimal32(s), 相当于Decimal(9-s,s)
    Decimal64(s), 相当于Decimal(18-s,s)
    Decimal128(s), 相当于Decimal(38-s,s)
    s:小数点的位数
    使用场景:一般金额字段、汇率、利率等字段,为了保证小数点精度,都使用Decimal进行存储。

  • 字符串

    1. String

      字符串可以任意长度的;它可以包含任意的字节集,包含空字节。

    2. FixedString(N)
      固定长度N的字符串,N必须是严格的正自然数;当服务端读取长度小于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度大于N的字符串时候,将返回错误信息。
      与String相比,极少会使用FixedString,因为使用起来不是很方便。

  • 枚举类型
    包括Enum8和Enum16类型;Enum保存‘string'=integer的对应关系

    Enum8 用‘String’= Int8对描述;127种类型
    Enum16用 'String' = Int16对描述。
    用法演示:

    CREATE TABLE t_enum
    (
        x Enum8('hello' = 1, 'world' = 2)
    )
    ENGINE = TinyLog
    

    这个x列只能存储类型定义中列出的值,'hello'或‘world’。如果尝试保存任何其他数据,会报错;
    枚举类型是就有优化,但优化带来了约束,只能放指定的值;不推荐使用

  • 时间类型
    Date “YYYY-MM-DD”
    Datetime “YYYY-MM-DD HH:mm:SS”
    Datetime64

  • 数组 Array(T)
    array(T), T可以是String,UInt8,UInt16,UInt32, UInt64,Date等
    []
    相当于hive的array

  • Nested
    相当于Hive的Struct,也相当于ElasticSearch的Nested
    列子:

Nested(
        ID UInt32,
        Serial UInt32,
        EventTime DateTime,
        Price Int64,
        OrderID String,
        CurrencyID UInt32),

你可能感兴趣的:(Clickhouse的特点)