列式数据库 | 青训营笔记

89 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第16天。

ClickHouse

数据库基本概念

数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统来控制。在现实中,数据、DBMS及关联应用一起被称为数据库系统,通常被称为数据库。

数据库类型可以被分为:关系型数据库以及非关系型数据库。

关系数据库:关系型数据库是把数据以表的形式进行存储,然后在各表之间建立关系,通过这些表之间的关系来操作不同表之间的数据。

非关系数据库:NoSQL或非关系型数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,NoSQL没有固定的表结构,并且数据之间不存在表与表之间的关系,数据之间是独立的。

从分布方式上可以分为单机数据库以及分布式数据库。

单机数据库:在一台计算机上完成数据的存储和查询的数据库系统。

分布式数据库:分布式数据库由位于不同站点的两个或者多个文件组成。数据库可以存储在多台计算机上,位于同一个物理位置,或分散在不同的网络上。

OLTPS数据库:OLTP数据库是一种高速分析数据库,专为多个用户执行大量事务而设计。

OLAP数据库:OLAP数据库旨在同时分析多个数据维度,帮助团队更好理解其数据中的复杂关系。

OLAP数据库特点:

大量数据的读写,PB级别的存储;

多维分析,复杂的聚合函数;

窗口函数,自定义UDF;

离线/实时分析

SQL

SQL语句的优点:

标准化:ISO和ANSI是长期建立使用的SQL数据库标准。

高度非过程化:用SQL进行数据操作,用户只需要提出“做什么”,而不必指明“怎么做”,因此用户无需了解存储路径,存储路径的选择以及SQL语句的操作过程都由系统自动完成,这不但能够大大减轻用户负担,同时还利于提高数据的独立性。

能够以同一种语法结构提供两种使用方式,用户可以在终端上直接输入SQL命令对数据库进行操作。作为嵌入式语言,SQL语句能够嵌入到高级语言程序中,供程序员设计程序时使用,而两种不同的使用方式下,SQL的语法结构基本一致。

语言简洁、易学易用:SQL功能极强,并且设计很巧妙,核心功能只有9个关键字,分别为:CREATE、ALTER、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE,并且SQL语言语法简单,接近英语口音,因此简单易学同时也很容易使用。

列式存储

列式存储的优点

数据压缩:

  • 数据压缩可以使度的数据更少,在IO密集型计算中可以获得更大的性能优势;
  • 相同类型的压缩效率更高;
  • 排序之后的压缩效率更高;
  • 可以针对不同类型使用不同的压缩算法;
  • 数据选择:可以选择特定的列进行计算而不是读取所有的列;
  • 对聚合计算很友好;

延迟物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤、聚合计算。

延迟物化的优点:

  • 缓存友好;
  • CUP/内存带宽友好;
  • 可以利用到执行计划和算子的优化,例如filter;
  • 保留直接在压缩列上做计算的机会。

ClickHouse存储设计

表的定义与结构

分布式表:不存储数据,用于将查询路由到集群的各个节点。

Cluster:逻辑集群,由多个节点组成。

Shard_key:知道数据写入分布式表时的分布方式。

本地表:实际存储数据的表。

索引实现
  1. 使用Hash Index:
  2. 将输入的key通过一个HashFunction映射到一组Bucket上。
  3. 每个bucket都包含一个指向记录的地址。
  4. 哈希索引在查找时只适用于等值比较。

使用B-Tree:

  1. 数据写入是有序的,支持增删改查。
  2. 每个节点都有多个孩子节点。
  3. 每个节点都按照升序排列Key值。
  4. 每个key有两个指向左右孩子节点的引用。

-左孩子节点保存的key都小于当前key。

-右孩子节点保存的key都大于当前key。

使用B+Tree:

  1. 所有数据都存储于叶子节点,非叶子节点只能保存key值。
  2. 叶子节点维护到相邻叶子结点的引用。
  3. 可以通过Key值做二分查找,也可以通过叶子节点做顺序访问。

对于大数据量,B与B+树深度太高。

索引的数据量太大,Log-strucured merge-tree是一种专门为大吞吐写入场景设计的数据结构。

这种数据结构着重优化顺序写入。

主要的数据结构:

SSTables; Memtable;

查询优化

构建多个主键索引

再建一个表,使用需要优化的字段来做主键的第一位。

建一个物化视图。

使用projection。

小结:

  • 主键包含的数据顺序写入;
  • 主键构造一个主键索引;
  • 每个列构建一个稀疏索引;
  • 通过mark的选择让主键索引可以定位到每一列的索引;
  • 可以通过多种手段优化非主键列的索引。
数据合并

在一个part中的数据是有序的,

不同part之间的数据是无序的,数据合并是将多个part合并在一起的过程。

数据的可见性:

  • 数据合并过程中,未被合并的数据对查询可见。
  • 数据合并完成后,新的part可见,被合并的part被标记删除。