数据库和列存储 | 青训营笔记

95 阅读4分钟

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

1 数据库基本概念

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

一个简单的例子

数据解析整理成有序集合

image.png

可以通过查询语言获取想要的信息

image.png

数据库的类型:关系型数据库、非关系型数据库;OLTP数据库、OLAP数据库。

1.1 OLAP数据库

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

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

窗口函数,自定义UDF

离线/实时分析

image.png

1.2 SQL

一种编程语言,目前几乎所有的关系型数据库都使用SQL编程语言来查询、操作和定义数据,进行数据访问控制。

image.png

一个简单的SQL查询包含SELECT关键词。星号(“”)也可以用来指定查询应当返回查询表所有字段,可选的关键词和子句。

FROM子句指定了选择的数据表。FROM子句也可以包含JOIN二层子句来为数据库表的连接设置规则。

WHERE子句后接一个比较谓词以限制返回的行。WHERE子句仅保留返回结果里使得比较谓词的值为TURE的行。

GROUP BY子句用于将若干含有相同值的行合并。GROUP BY通常与SQL聚合函数连用,或者用于清除数据重复的行。GROUP BY子句要用在WHERE子句之后。

定义数据类型

image.png

读写数据库数据

image.png

SQL的优点:1标准化,ISO和ANSI是长期建立使用的SQL数据库标准。2高度非过程化,用SQL进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无需了解存储路径,存储路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减少了用户负担,而且有利于提高数据独立性。3以同一种语法结构提供两种使用方式,用户可以在终端上直接输入SQL命令对数据库进行操作。作为嵌入式语言,SQL语句能够嵌入到高级语言(如C、C#、JAVA)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL的语法结构基本上是一致的。4、语言简洁,易学易用:SQL功能极强,但由于设计巧妙,语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词:CREATE、ALTER、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。且SQL语言语法简单,接近英语口语,因此容易学习,也容易使用。

1.3 数据库架构

image.png

1.4 SQL的执行

image.png

Parser:词法分析,语法分析,生成AST树。

Analyzer:变量绑定、类型推导、语义检查、安全、权限检查、完整性检查等,为生成计划做准备。

例如:

判断a,b是不是类型正确

a,b是不是来自表t

group by字段是否合法,是否存在聚合函数。

image.png

Optimizer:为查询生成性能最优的执行计划,进行代价评估。

1.5 存储引擎

image.png

管理内存数据结构:索引、内存数据、缓存(Query cache、Data cache、index cache)

管理磁盘数据:磁盘数据的文件格式;磁盘数据的增删查改。

读写算子:数据写入逻辑;数据读取逻辑。

2 列式存储

行式存储:

image.png

列式存储:

image.png

2.1 列式存储的优点

数据压缩:1.数据压缩可以使读的数据更少,在IO密集型计算中获得更大的性能优势。2.相同类型压缩效率更高。3.排序之后压缩效率更高。4.可以针对不同类型使用不同的压缩算法。

image.png

LZ4:(5,4)代表向前5个byte,匹配到的内容长度有4,即“bcde”是一个重复;重复项越多或者越长,压缩率就会越高。

image.png

Run-length encoding:压缩重复的数据;可以在压缩数据上直接计算。

Delta encoding:将数据存储为连续数据之间的差异,而不是直接存储数据本身;特定算子也能直接在压缩数据上计算。

image.png

数据选择:可以选择特定的列做计算而不是读所有列;对聚合计算友好。

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

image.png

延时物化:缓存友好、CPU/内存带宽友好、可以利用到执行计划和算子的优化,例如filter、保留直接压缩在列做计算的机会。

数据格式要求:需要处理多个数据,因此数据需要是连续内存;需要明确数据类型。

image.png

2.2 行存VS列存

image.png