这是我参与「第五届青训营 」笔记创作活动的第14天。
一、本堂课重点内容:
首先学习数据库的基本概念,理解其中的专有名词;然后学习列式存储的特点及其应用场景;学习ClickHouse存储设计所包含的知识点;最后了解ClickHouse典型应用场景。
二、详细知识点介绍:
(1)数据库的基本概念
数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统来控制。在现实中,数据、DBMS及关联应用一起被称为数据库系统,通常简称为数据库。
关系型数据库:关系型数据库是把数据以表的形式进行存储,然后在各个表之间建立关系,通过这些表之间的关系来操作不同表之间的数据。
非关系型数据库:NoSQL或非关系型数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,NoSQL没有固定的表结构,且数据之间不存在表与表之间的关系,数据之间可以是独立的。
单机数据库:在一台计算机上完成数据的存储和查询的数据库系统。
分布式数据库:分布式数据库由位于不同站点的两个或多个文件组成。数据库可以存储在多台计算机上,位于同一个物理位置,或分散在不同的网络上。
OLTP数据库:online transactional processing,是一种高速分析数据库,专为多个用户执行大量事务而设计。
OLAP数据库:online analytical processing,旨在同时分析多个数据维度,帮助团队更好地理解其数据中的复杂关系。
(2)列式存储
1、优点:查询时只有涉及到的列会被读取,投影很高效,任何列都能作为索引,便于做延迟物化和向量化计算,压缩效率高,每一列可以使用不同的压缩算法。
2、缺点:选择完成时,被选择的列要重新组装。INSERT/UPDATE比较麻烦。点查询不适合。
3、适应场景:统计分析类查询(OLAP,比如数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少,关联、分组操作较多)。及时查询(查询条件不确定,行存表扫描难以使用索引)。
(3)ClickHouse存储设计
1、表定义和结构。分布式表;本地表。
2、集群架构。
3、引擎架构。
4、存储架构。
5、索引设计。Hash Index;B-Tree;B+Tree。
6、查询优化。构建多个主键索引;再建一个表;建一个物化视图;使用Projection。
7、数据合并。
8、数据查询。
(4)ClickHouse典型应用场景
1、大宽表存储和查询。大宽表查询可以建非常多的列;可以增加,删除,清空每一列的数据;查询的时候引擎可以快速选择需要的列;可以将列涉及到的过滤条件下推到存储层从而加速查询。动态表结构,map中的每个key都是一列,map中的每一列都可以单独的查询,使用方式同普通列,可以做任何计算。
2、离线数据分析。数据导入。数据按列导入,保证查询可以及时访问已有数据,可以按需加载需要的列。
3、实时数据分析。数据先缓存在内存中,到达一定的阈值再写到磁盘。
4、复杂数据查询。
三、实践练习例子:
(1)查询优化(使用Projection)
ALTER TABLE hits_UserID_URL
ADD PROJECTION prj_url_userid
(
SELECT *
ORDER BY (URL, UserID)
);
(2)数据查询
SELECT
URL,
count(URL) AS Count
FROM hits_UserID_URL
WHERE UserID = 749927693
GROUP BY URL
ORDER BY Count DESC
LIMIT 10
四、课后个人总结:
ClickHouse是标准的列存结构,存储设计是LSM-Tree架构,使用稀疏索引加速查询,每个列都有丰富的压缩算法和索引结构,基于列存设计的高效的数据处理逻辑。