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

news2025/1/18 16:50:16

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

🙋🏻‍♀️:等等,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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端中不同格式的日期相互转换(字符串、时间戳)js相关

在项目中遇到了,需要实现字符串和Unix时间戳的相互转换,随手记录一下。 我使用的组件库为Naive UI,涉及到的组件为日期选择器(Date Picker)。作者在文档中写道: 实话说我不喜欢这个 feature,因为…

训练营第三十三天贪心(第五部分重叠区间问题)

训练营第三十三天贪心(第五部分重叠区间问题) 435.无重叠区间 力扣题目链接 题目 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: …

TapData + 实时数仓:实时数据如何赋能船舶制造业,助力数字化应用升级和科学管理运营

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

笔试狂刷--Day5(最小公倍数+最优路径)

大家好,我是LvZi,今天带来笔试狂刷--Day5 一.求最小公倍数 链接:求最小公倍数 分析: 数学知识–辗转相除法(迭代/递归) 代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args)…

计算机视觉——两视图几何求解投影矩阵

上文我提到了通过图像匹配得到基本矩阵,接下来我们要接着求解投影矩阵。 计算投影矩阵思路 假设两个投影矩阵为规范化相机,因此采用基本矩阵进行恢复。在规范化相机下, P [ I ∣ 0 ] P[I|0] P[I∣0], P ′ [ M ∣ m ] P[M|m] P′[M∣m]。…

【结构型模型】享元模式

一、享元模式概述 享元模式定义:又叫蝇量模式,运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

Bootloader应用启动分析详解

内存->磁盘 引导程序->核心->根文件系统rootfs->app 引导程序加载最重要 由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同 uboot是对CPU架构和OS类型支持得比较多得一种开源引导程序 Bootloader的种类 s5p6818启动流程 芯片最开始是从iROM启动,…

【漏洞复现】泛微e-Mobile 移动管理平台文件上传漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

大型企业不同安全域文件交换,常见方式的优势与问题对比

现在越来越多的企业通过对网络进行物理或逻辑隔离,将内部网络与外部网络隔离开来,从而限制非法访问和恶意渗透,防止敏感数据泄露和恶意代码的传播,提高网络安全性。对于大型企业而言,将网络分为内外网并不足以满足安全…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 redis底层数据结构已完结👏👏👏: ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之Int…

UNet网络在图像去模糊方向的应用

前一段时间,我们学习了关于UNet网络的结构和基于UNet网络的去模糊网络MIMO-UNet,DeepRFT等网络的结构,大致的对网络的结构组成和实现过程有了一定的了解,下面考虑在图像去模糊部分,基于UNet的已有的研究工作&#xff0…

【力扣】螺旋矩阵

59. 螺旋矩阵 II 刚开始遇到这道题目的时候相信没见过的同学多多少少都会有点懵圈,感觉题目有点无从下手,但其实只要抓住本质就行了,题目的最终目的就是返回一个二维数组的结果,这个二维数组的大小是的 int[n][n],题目…

Linux-线程互斥和死锁

目录 一.线程互斥 1.1 进程线程间的互斥相关背景概念 1.2 互斥量mutex 二.互斥量的接口 2.1 初始化互斥量 2.2 销毁互斥量 2.3 互斥量加锁和解锁 2.4 改进后售票代码 三.死锁 3.1.什么是死锁? 3.2.死锁四个必要条件 3.3 避免死锁 一.线程互斥 1.1 进程…

纳米尺度下的单粒子追踪,厦门大学方宁团队用 AI 奏响「细胞里的摇滚」

在微观世界里,每一个细胞都是一个繁忙的城市,而分子们则是这个城市中的居民。想象一下,如果我们能够追踪这些居民的每一个动作,或许便能够揭开生命奥秘的一角。这就是科学家们在活细胞中进行 3D 单粒子跟踪 (single particle trac…

Android MVVM架构 + Retrofit完成网络请求

关于Retrofit,这个应该不是一个很新颖的东西了,简单过一下吧 1.由Square公司开发,基于Type-safe的REST客户端。 2.使用注解来定义API接口,使得HTTP请求变得简洁且易于维护。 3.支持同步和异步请求,可与RxJava、Corouti…

模块三:二分——162.寻找峰值

文章目录 题目描述算法原理解法一:暴力查找解法二:二分查找 代码实现解法一:暴力查找解法二:CJava 题目描述 题目链接:162.寻找峰值 根据题意,需要使用O(log N)的时间复杂度来解决,得出本道题…

HTTP协议的总结

参考 https://www.runoob.com/http/http-tutorial.html 1.简介 HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模…

javaWeb项目-邮票鉴赏系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Java技术 Java 程…

《Linux运维实战:基于银河麒麟V10+鲲鹏920CPU部署DM8数据库主备集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、安装前准备 1.1、硬件环境 数据守护集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况,其他环境配置项建…