首页 > 其他分享 >什么是列式`存储,一文秒懂

什么是列式`存储,一文秒懂

时间:2023-03-31 18:56:44浏览次数:54  
标签:存储 一文 列式 数据库 写入 博客 数据

什么是列式`存储,一文秒懂

为什么MaxCompute采用列式存储?列式存储和行式存储的主要区别在哪

从数据存储讲起

我们最先接触的数据库系统,大部分都是行存储系统。大学的时候学数据库,老师让我们将数据库想象成一张表格,每条数据记录就是一行数据,每行数据包含若干列。所以我们对大部分数据存储的思维也就是一个复杂一点的表格管理系统。我们在一行一行地写入数据,然后按查询条件查询过滤出我们想要的行记录。

大部分传统的关系型数据库,都是面向行来组织数据的。如 Mysql,Postgresql。近几年,也越来越多传统数据库加入了列存储的能力。虽然列存储的技术在十几年前就已经出现,却从来没有像现在这样成为一种流行的存储组织方式。

行存储和列存储,是数据库底层组织数据的方式。(和文档型、K-V 型,时序型等概念不在一个层次)

行存储

行存储系统以行的方式来组织数据。假设现在有以下 blog 数据(大学时老师布置系统课题作业总是让我们做一个博客系统,大概因为他们最先接触的互联网就是 BBS 吧):

1

2

行存储将会以下列方式将数据存储在磁盘上。我们可以思考一下,这样的方式利于什么样的存储?(此处停顿 5 秒思考一下)它利于数据一行一行的写入,写入一条数据记录时,只需要将数据追加到已有数据记录后面即可。

行模式存储适合 OLTP(Online Transaction Processing)系统。因为数据基于行存储,所以数据的写入会更快。对按记录查询数据也更简单。
大部分同学会问,我们的做的系统不就是在为了这个吗?所以我为什么还需要列式存储,而列式存储又是什么?

让我们想象一种场景,现在不是想查询 Bob 的博客,我想统计 Bob 发表的博客数,或是整个系统今天的博客点赞数。如果是行存储系统,数据库将怎样操作?(停顿思考 10 秒)

3

如图,想统计所有点赞数,首先需要将所有行数据读入内存,然后对 like_num 列做 sum 操作,从而得到结果。我们假设磁盘一次可以读取图中 3 个方框的数据(实际需要按 byte 来读取),那么这个聚合计算需要 N(N=数据量)次磁盘访问。

这种经常需要通过大量数据集来聚合统计数据的需求其实是 OLAP 系统的常见行为。基于这个需求我们也可以明白为什么这几年列式存储开始流行。因为数据,大数据,数据分析,也就是 OLAP(Online Analytical Processing)在线分析系统的需求增多了,数据写入的事务和按记录查询数据都不是它的关注点,它关注的是数据过滤,统计。

列存储

同样是上面的示例数据,我们来看列式存储是怎样组织数据的。

4

5

如图所示,列式存储将每一列的数据组织在一起。可以思考一下这样利于什么呢?(停顿 5 秒)

是的,利于对于列的操作,如上面我们说到的统计所有 like_num 之和。其过程将如下:

6

依然假设磁盘一次可以读取 3 个方框的数据(实际按 byte 读取)。可以看出按列存储组织数据的方式,只需要 1 次磁盘操作就可以完成。
在程序的世界里,我们学会了,任何的选择和倾向都是有代价的。空间换时间,时间换空间,一致性可用性相互平衡等。选择列式存储必然也有不利的一面。首先就表现在数据写入上。

7

当一条新数据到来,需要将每一列存储到对应的位置。这样就需要多次写磁盘操作。(当然真实的数据库不会出现图中”挤一挤“、”挪一挪“的情况,数据库会将不同列数据组织在不同的地方;对于多次写操作的问题,大部分存储系统会通过缓冲来降低这种情况带来的不足)

对比

8

列存储优势

基于列模式的存储,天然就会具备以下几个优点:

  • 自动索引

因为基于列存储,所以每一列本身就相当于索引。所以在做一些需要索引的操作时,就不需要额外的数据结构来为此列创建合适的索引。

  • 利于数据压缩

利于压缩有两个原因。一来你会发现大部分列数据基数其实是重复的,拿上面的数据来说,因为同一个 author 会发表多篇博客,所以 author 列出现的所有值的基数肯定是小于博客数量的,因此在 author 列的存储上其实是不需要存储博客数量这么大的数据量的;二来相同的列数据类型一致,这样利于数据结构填充的优化和压缩,而且对于数字列这种数据类型可以采取更多有利的算法去压缩存储。

最后

目前列存储模式在很多分析型数据库中都很常见。而且因为大数据分析型需求的增多,越来越多传统的行存储数据库也加入了列存储的模式,比如 Oracle 和 Sql Server 都有了列存储的特性。

之前讲的 Apache Druid 底层数据存储就是基于列模式。有兴趣的可以回顾一下。另外 HBase 是一个比较有代表性的列存储模式数据库。有时间可以来聊一聊 HBase 底层是如何存储数据的。也可以讲一讲数字列的压缩方式(大家也可以先思考一下可以如何压缩数字列)。

标签:存储,一文,列式,数据库,写入,博客,数据
From: https://www.cnblogs.com/wxdlut/p/17277207.html

相关文章

  • 一文搞懂Java异常处理
    一、什么是异常处理在Java编程中,异常处理是一种机制,用于处理程序运行时可能出现的异常情况。当程序出现异常时,程序会抛出一个异常对象,如果不加以处理,程序就会终止运行。因此,我们需要使用异常处理机制来捕获并处理这些异常,以使程序能够在出现异常时继续运行。在Java中,异常处理主要......
  • 一文看懂5G射频的“黑科技”
    手机,作为移动互联网时代的标配,已经走进了我们每个人的生活。有了它,我们可以随心所欲地聊天、购物、追剧,享受美好的人生。正因为手机如此重要,所以人们对相关技术的发展十分关注。每当有新品发布,媒体会进行长篇累牍的报道,社交网络上也会掀起热烈的讨论。然而,人们对手机的关注,往往集中......
  • 数据的存储
    1、内置类型:char、int、short、long、float、double   决定了开辟内存空间的大小   决定了内存空间的视角2、整形家族   ①char:127至-128(123...126127-128-127-126...-2-101)    unsignedchar:0至255    signedchar:127至-128  ②i......
  • 一文看懂时序预测 or 销量预测场景下的的评估指标
    文章目录前言1.加权分位数损失(wQL)2.加权绝对百分比误差(WAPE)3.均方根误差(RMSE)4.平均绝对误差(MAE)5.平均百分比误差(MAPE)6.平均绝对缩放误差(MASE)总结前言在时序预测或者销量预测场景中,我们会通过确定一些准确率指标来评估我们的预测值。在学术界和工业界,我们常用指标有:均方根误差(RMSE)、......
  • 《做一个不背锅运维:理论篇:让我们一起鲁克鲁克——rook(开源存储编排)》
    写在开篇本文结合了官方文档对rook的知识点做了一个梳理,帮助有需要的朋友快速入门,本篇不讲实战操作,下篇再讲。官方文档:https://rook.io/docs/rook/v1.11/Getting-Started/intro/什么叫面向K8S的开源云原生存储面向Kubernetes的开源云原生存储通常是指支持Kubernetes本地对......
  • 一文总结你需要的OpenCV操作
    目录一、OpenCV简介1.1OpenCV是什么1.2安装及使用二、图像的基础2.1成像原理2.2图像格式2.3颜色空间三、OpenCV基础操作3.1图像的读取、显示、保存3.2通道转换三、OpenCV常见图像处理3.1在图像上绘制几何图像及添加文字3.2图像的几何变换3.3图像滤波3.4图像增强3.5形......
  • nginx文件存储
    yuminstall-yhttpd-tools htpasswd-cb/etc/nginx/htpasswdmynginx123456 auth_basic"Pleaseentertheusernameandpassword";#这里是验证时的提示信息auth_basic_user_file/etc/nginx/htpasswd; location/{  if($request_filename~*^.*?\.(txt|pd......
  • 云存储继续火 Symform获1100万美元融资
    今年云储存火了,雷锋网昨天刚介绍一家云储存公司Terascala获1400万美元融资,今天一家云存储公司Symform也宣布融资1100万美元,由WestRiverCapital领头,已有投资人OVP及Longwo......
  • SpringBoot中集成Redis实现对redis中数据的解析和存储
    场景SpringBoot中操作springredis的工具类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108335645上面讲的操作redis的工具类,但是对于redis的集成并没......
  • 一文详解ODBC、OLEDB、ADO、ADO.NET之间的关系
    目录一、ODBC二、OLEDB三、ADO四、ADO.NET五、总结名词解释版权声明推荐阅读相信看到这篇文章的人,心中肯定有这样的想法:ODBC、OLEDB、ADO、ADO.NET貌似都是访问数据库的......