那些你不知道的数据库知识:行式存储和列式存储

前几天听课,听到老师讲数据列式存储。

🙋🏻‍♀️:等等,what,什么列式存储,数据一行一行的展示,然后一行一行的存在数据库里面不就好了,什么叫做列式存储,难道将数据按每一列存在数据库里面,那取出数据该有多麻烦啊,这绝对是几十年前的糟粕方法,这个课听不得了,教的东西太老套了。

老师🧑🏻‍🏫:别急别急啊,同学,年轻人不要这么心浮气躁嘛,列式存储的存储效率在现在流行的大数据存储中发挥着重要的作用,其存储效率可比行式存储高的多。我先给你举个例子吧。

10005447.jpg

以学生信息表stu演示。sid为主键,表中记录这五位学生的信息。

image.png

大家比较熟悉的是行式存储,如关系型数据库(MySQL、Oracle等)的存储均采用行式存储,行式存储一目了然,如下图所示,每一位学生的信息存储在存储在存储介质上,先存储zhangsan同学的所有信息,再存储lisi同学的信息,依次存储剩下同学的信息,如下图所示:

image.png

而列式存储,学生的信息数据都是分开保存的,即每一列的数据单独存放,如下图所示,每一列的数据存储在存储介质上,先存储sid这一列,然后存储sname这一列,依次存储剩下的列,如下图所示:

image.png

🙋🏻‍♀️:好的老师,我已经明白您的背景了,快跟我讲讲列式存储的优点吧。

1017E368.jpg

老师🧑🏻‍🏫:那就先来一起看看两种存储方式存储在存储介质上的情况吧。
行式存储,每一个学生的信息都存储在相邻的地方,存储完一个学生的信息,再存储下一个学生的信息,以此类推,如下图所示:

image.png

列式存储,将每一列的数据存储在相邻的地方,然后再存储下一列数据,以此类推,如下图所示:

image.png

老师🧑🏻‍🏫:现在假设一种场景,我要你帮我取出所有学生的姓名,也就是sname这一列,你会怎么做?

对于SQL语句select name from stu;简简单单,可是在存储介质上取出数据的时候,你知道如何取出吗?

对于行式存储,必须从头到尾遍历存储数据,依次取出sname姓名的数据。

image.png

缺点就比较明显了,当我只需要访问几个列时,其他无关列的数据也会被读取,导致IO开销较大;而且数据 **压缩比 **较低,因为每行数据都存储在一起。

对于列式存储,这就简单了,直接定位到sname姓名的位置,就可以直接取出需要的数据了。
在分析型查询(OLAP)中,列式存储通常提供更高的性能。这是因为它只读取查询所需的列,大大减少了IO成本,加快了查询速度。

而且对于同一列的数据类型相同,便于压缩,通常具有更高的压缩比。非常适合大数据存储,如数据仓库,因为它可以快速读取和分析大量数据。

image.png

🙋🏻‍♀️:等等,MySQL不是有索引吗?我给sname单独加一条索引不就行了,这样查询的时候就可以利用 索引覆盖 的特性,直接拿到这一列的数据了呀!

10131434.gif

老师🧑🏻‍🏫:这位同学,请注意我们现在讲的是列式存储和行式存储,不是在讲MySQL哈。而且像你这样单独给sname加一条索引的做法,其实就是把同一列的数据存储在了一起,也是列式存储的一种应用方式。

🙋🏻‍♀️:原来MySQL里也有列式存储啊……

image.png

🙋🏻‍♀️:再等等,如果我要一个场景,请取出名字为‘zhangsan’的同学的所有信息,阁下该如何应对?

老师🧑🏻‍🏫:啊这,角色互换了,这样列式存储的效率确实比行式存储的效率低很多了。
对于行式存储,只需要定位到“zhangsan”的位置,就可以直接取出需要的信息;
那行式存储的优点显而易见,对单行数据的操作效率更高,比较适用于事务型查询(OLTP),像频繁的增删改查的操作;当需要访问整行数据时,性能比较高;写入也会比较快,因为一次性完成整行的数据;

image.png

对于列式存储,需要从头到尾遍历数据,根据元数据信息,一次取出“zhangsan”的信息。
列式存储的致命缺点就是行事查询、更新和删除操作比较复杂,因为需要处理多个列。而且写入性能比较低,因为需要将一行数据拆分成多个列分别写入。

image.png

老师🧑🏻‍🏫:你这小子,倒也不傻,我看你骨骼清奇,若勤加修炼,日后必得高升,我这有一本数据库修炼秘籍,只要九十九,你看,带不带一本走?
🙋🏻‍♀️:6啊,现在的广告真隐蔽。

1018B7BF.gif


言归正传,再来正式的聊聊行式存储和列式存储吧。

列式存储比行式存储可以节省多少空间

大家一定非常好奇,列式存储比行式存储到底可以节省多少空间,才让博主绕这么一大圈来讲列式存储。

毫无疑问,列式存储比行式存储具有更高的数据压缩率。根据数据的类型和压缩技术,列式存储可以实现高达十倍甚至更高的压缩比,这意味着,列式存储能够节省大量的存储空间,降低存储成本。

101BEA1B.gif

当然,具体节省的空间取决于多种因素,包括数据的重复性,列中数据类型的一致性以及采用的压缩算法。在实际应用中,节省的空间可能会有很大的差异,例如,如果一个数据集中的某些列包含大量重复的值,那么列式存储在这些列上的压缩效果会非常显著。

而对于数据变化较大,不适合压缩的场景,节省的空间可能就不那么明显了。

列式存储和行式存储的区别

说了这么多,那列式存储和行式存储之间还有其他区别吗?

当然有,这区别可是非常大的,你且慢慢看来:

  1. 结构灵活性:
    • 列式存储倾向于结构弱化,更适合于不定长的记录和稀疏数据集,因为它可以有效地处理不存在的列。
    • 行式存储则倾向于结构固定,每行数据都需要有相同的列结构。
  2. 主键存储:
    • 行式存储中,一行数据仅需要一个主键。
    • 列式存储中,存储一行数据可能需要多份主键,因为每个列都是独立存储的。
  3. 压缩算法的选择:
    • 列式存储可以针对不同列类型,选择最合适的压缩算法,因为每列数据的类型是已知的。
    • 行式存储的压缩算法选择不如列式存储灵活,因为它需要处理多种数据类型的混合。
  4. IO消耗:
    • 列式存储在查询时只需要读取参与计算的列,极大地减低了IO消耗。
    • 行式存储在读取少数几列时,需要遍历其他无关列,IO开销较大。
  5. 数据更新:
    • 列式存储不适用于数据需要频繁更新的交易场景,因为每次更新可能涉及多个列的变更。
    • 行式存储更适合频繁更新的场景,因为整行数据通常是连续存储的。

拓展:ORC存储

另外,向大家推荐一种存储方式,即ORC存储,也叫混合存储结构。

ORC(Optimized Row Columnar)是一种高效的列式存储格式,最初由Apache Hive项目开发,用于优化Hadoop数据存储和查询速度。它并不是纯粹的列式存储,而是采用了混合存储结构,先按行组分割表,然后在每个行组内部按列存储数据。ORC文件是自描述的,其元数据使用Protocol Buffers序列化,且数据尽可能压缩以减少存储空间消耗。

ORC文件的主要优势包括:

  • 高压缩比:列式存储运行多种文件压缩方式,提供很高的压缩比;
  • 文件可切分:便于在Hive等系统中分布式处理。
  • 索引支持:提供多种索引,如row group index和bloom filter index,以优化查询。
  • 复杂数据结构支持:能够处理如Map等复杂数据类型。

ORC文件结构包括多个层级,如文件级元数据、stripe(包含多条记录的行组)、stripe元数据和row group,这些结构支持有效的数据读取和查询优化。例如,ORC利用三个层级的统计信息来实现谓词下推,从而避免读取不必要的数据,提高查询性能。

后记

这篇关于数据的行式存储和列式存储,其实是我女朋友在学习大数据知识的时候了解到的,我个人对这块也只是一知半解,如果文中有错误的地方,欢迎大家在评论区指出。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rust中结构体的属性默认是不能修改的,要想修改可以有两种方式

Rust中结构体里面的属性默认是不支持修改的,而且默认不是pub的,要想修改的话,有两种方式,我以为和python里面的类似呢,但是还是需要一点技术含量的。如果想在引到外部修改,需要声明pub,如果想在…

专利视角下的量子竞赛:《2024全球专利格局白皮书》

2024年1月,欧洲量子产业联盟(QuIC)发布了题为《全球量子技术专利格局描述》的综合白皮书。 该文件以透明的视角展示了当今的知识产权格局,包括知识产权持有人的地理分布。该文件由 QuIC 知识产权(IP)与贸易…

【C++】图的存储 -- 邻接表

目录 邻接表的创建使用dfs遍历图dfs遍历图的递归思想 邻接表的创建 #include <iostream> using namespace std; #include <vector>struct edge//创建边集类型 {int v;//出边int w;//权值 }; const int N 100010;//顶点数量 vector<edge> e[N];//邻接表int m…

淘宝新店有流量扶持吗

淘宝新店有流量扶持 淘宝新店需要做些推广提高店铺权重 淘宝新店用3an推客做推广比较好 3an推客是给商家提供的营销工具&#xff0c;3an推客CPS推广模式由商家自主设置佣金比例&#xff0c;以及设置商品优惠券&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最…

初步认识泛型

文章目录 泛型的编译擦除机制 泛型的上界泛型方法 泛型的编译 擦除机制 泛型到底是怎么编译的&#xff1f;这个问题&#xff0c;也是曾经的一个面试问题。泛型本质是非常难的语法 通过命令&#xff1a;javap -c 查看字节码文件&#xff0c;所有的T都是Object。 在编译的过程当…

“量子谷”启程!数亿资金注入,加速量子、人工智能创新

2024年4月23日&#xff0c;欧洲委员会启动了新一轮“地平线欧洲”&#xff08;Horizon Europe&#xff09;项目征集&#xff0c;动用资金总额超过1.12亿欧元&#xff08;约8.67亿人民币&#xff09;。此次征集活动主要面向人工智能&#xff08;AI&#xff09;与量子技术领域的前…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

redis和mysql数据一致性方案

请求 A 更新数据 请求B读数据 在高并发情况下&#xff0c;A、B请求过程步骤相互穿插&#xff0c;就会出现图中的问题。 期望redis 的数据是11&#xff0c;最后变成了10 场景&#xff1a;先删除Redis&#xff0c;再更新 MySQL&#xff0c;不主动更新Redis&#xff0c;访问redi…

软件企业质量保证的基石――QA,QC的良性协作

软件企业质量保证的基石――QA、QC的良性协作 国内的软件产业发展了20多年的时间&#xff0c;已经由个人英雄时代步入到中、小团队协作时代。相信不久的将来&#xff0c;国内一定会出现航母级的软件企业&#xff0c;那时候我们会迎来集团军作战的时代。不同的时代表明软件规模…

【AI相关】数学和统计学知识

数学和统计学的知识可以分为两部分&#xff1a; 一部分是线性代数中的基础概念&#xff0c;比如标量、向量和张量。 另一部分是概率统计中常见的分布类型&#xff0c;比如正态分布和伯努利分布。 线性代数 什么是标量&#xff1f; 标量是一个单独的数&#xff0c;可以是整…

PLC基本原理及其接线

目录&#xff1a; 一、PLC的简介与起源 二、PLC的基本结构 1、MCU模块 2、输入与输出模块 3、电源模块 4、编程设备 三、PLC的外部接线 1、PNP与NPN接线 2、三菱PLC的NPN与PNP设置 下续&#xff1a;三菱FX系列PLC-编程1 一、PLC的简介与起源 1、PLC简介 PLC的全称为…

Prompt之美:如何设计提示词让大模型变“聪明”

目录 一. Prompt关键要素 二. Prompt技巧 三. 实战中的Prompt优化 四. 参考文献 一. Prompt关键要素 Prompt是一个简短的文本输入&#xff0c;用于引导AI模型生成特定的回答或执行特定任务。换句话说&#xff0c;Prompt是你与AI模型沟通的方式。一个好的Prompt可以让AI更准…

猫头虎分享已解决Bug || **Error: ‘Promise‘ is undefined**

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【SpringBoot】00 Maven配置及创建项目

一、Maven配置 1、下载Maven 进入官网下载&#xff1a;Maven – Welcome to Apache MavenMaven – Download Apache Maven 本文以最新版为例&#xff0c;可按需选择版本 Maven – Welcome to Apache Maven 2、解压下载好的安装包 将安装包解压到自己设置的空文件夹中 3、…

抽象的代理模式1.0版本

前言&#xff1a; 在阅读Spring Security官方文档时&#xff0c;里面设计到了一种设计模式——代理模式Proxy 众里寻她千百度&#xff0c;蓦然回首&#xff0c;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

利用 easycode 自动生成 数据库表 对应 类文件

1、安装easycode 打开settings&#xff0c;在plugins中搜索easycode进行安装&#xff0c;安装完成后重启idea。 2、连接数据库 连接数据库&#xff0c;填写数据库配置信息 点解Test connetction测试连接&#xff0c; 3、生成文件 右键数据库表格&#xff0c;生成对应文件 4…

说方法不如传授经验向媒体投稿你可以这样

在信息爆炸的时代,作为单位的信息宣传员,肩负着将本单位的重要资讯、活动成果、政策解读等内容有效传播至公众视野的重任。其中,向各类媒体投稿无疑是实现这一目标的重要途径。然而,传统的邮件投稿方式常常让我深感力不从心,费时费力不说,成功率低、出稿慢等问题更是让我和领导…

商标申请注册交费就一定会下注册证?

近日遇到一个网友说普推知产老杨说&#xff0c;他以为商标交钱就一定会下商标注册证&#xff0c;这个不管找哪家也做不到的。商标申请注册时要给商标局交费用&#xff0c;交完费用商标才有商标的形式审查&#xff0c;通过后下受理书&#xff0c;才有后面商标实质审查&#xff0…

[柏鹭杯 2021]试试大数据分解?

题目&#xff1a;&#xff08;NSSCTF | 在线CTF平台&#xff09; 题目就是如此&#xff0c;我没看到有5个不同的文本&#xff0c;其中最后一个文本以pem后缀&#xff0c;所以我们先来了解一下什么是pem格式。 PEM 格式 PEM格式通常用于数字证书认证机构&#xff08;Certifica…

UI自动化测试框架:PO 模式+数据驱动(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff…