【数据库系列】什么是列式存储和行式存储

简介: 列式存储:每一列单独存放,数据即是索引。只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。行式存储: 把一行数据作为一个整体来存储。学习:https://blog.csdn.net/qq_43543789/article/details/108662140。......

一、列式存储和行式存储

列式存储是指一列中的数据在存储介质中是连续存储的;

行式存储是指一行中的数据在存储介质中是连续存储的。

简单的说,可以把列式数据库认为是每一列都是一个表,这个表只有一列,如果只在该列进行条件查询,速度就很快。

二、列式存储和行式存储优比较

2.1 行式存储

传统的行式数据库将一个个完整的数据行存储在数据页中。这种方式在大数据量查询的时候会出现以下问题:

1、在没有索引的情况下,会把一行全部查出来,查询会使用大量IO
2、虽然建立索引和物化视图可以可以快速定位列,但是也需要花费大量时间
image.gif

但是如果处理查询时需要用到大部分的数据列,这种方式在磁盘IO上是比较高效的。

一般来说,OLTP(Online Transaction Processing,联机事务处理)应用适合采用这种方式。

2.2 列式存储

列式数据库是将同一个数据列的各个值存放在一起。插入某个数据行时,该行的各个数据列的值也会存放到不同的地方。

例如上例中列式数据库只需要读取存储着“时间、商品、销量”的数据列,而行式数据库需要读取所有的数据列。因此,列式数据库大大地提高了OLAP大数据量查询的效率。

当然,列式数据库不是万能的,每次读取某个数据行时,需要分别从不同的地方读取各个数据列的值,然后合并在一起形成数据行。

因此,如果每次查询涉及的数据量较小或者大部分查询都需要整行的数据,列式数据库并不适用。

三、列式存储优势

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

1,自动索引

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

2,利于数据压缩

一、大部分列数据基数其实是重复的:例如,因为同一个 author 会发表多篇博客,所以 author 列出现的所有值的基数肯定是小于博客数量的,因此在 author 列的存储上其实是不需要存储博客数量这么大的数据量的;

二、相同的列数据类型一致:这样利于数据结构填充的优化和压缩,而且对于数字列这种数据类型可以采取更多有利的算法去压缩存储

 

四、适用场景

4.1 行式储存

    1. 关注整张表内容,或者需要经常更新数据
    2. 需要经常读取整行数据
    3. 不需要聚集运算,或者快速查询需求
    4. 数据表本身数据行并不多
    5. 数据表的列本身有太多唯一性的数据

    数据库常规设计,一般会采用行式存储

    4.2 列式存储

      1. 基于一列或比较少的列计算的时候
      2. 经常关注一张表某几列而非整表数据的时候
      3. 数据表拥有非常多的列的时候
      4. 数据表有非常多行数据并且需要聚集运算的时候
      5. 数据表列里有非常多的重复数据,有利于高度压缩

      算法中输出或者输入的csv文件,一般是列式存储

      五、总结:

      列式存储每一列单独存放,数据即是索引。

                       只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。

                       一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。

      行式存储: 把一行数据作为一个整体来存储

       


      相关文章
      |
      2月前
      |
      存储 SQL Web App开发
      SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
      SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
      58 2
      |
      4月前
      |
      存储 缓存 关系型数据库
      鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
      阿里云RDS率先推出新型存储类型通用云盘,提供低延迟、低成本、高持久性的用户体验。
      鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
      |
      3月前
      |
      存储 NoSQL MongoDB
      Python爬虫之非关系型数据库存储#5
      MongoDB、Redis【2月更文挑战第18天】
      45 1
      |
      4天前
      |
      存储 负载均衡 监控
      关系型数据库搭建高可用存储集群
      关系型数据库搭建高可用存储集群
      21 4
      |
      4月前
      |
      存储 NoSQL 数据库
      知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
      知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
      知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
      |
      13天前
      |
      存储 SQL 关系型数据库
      存储系统、数据库和对象存储 | 青训营
      存储系统、数据库和对象存储 | 青训营
      |
      17天前
      |
      存储 SQL 关系型数据库
      关系型数据库存储优化
      关系型数据库存储优化
      23 1
      |
      23天前
      |
      存储 SQL 数据库
      C# 将 Word 转文本存储到数据库并进行管理
      C# 将 Word 转文本存储到数据库并进行管理
      |
      25天前
      |
      存储 关系型数据库 MySQL
      如何处理爬取到的数据,例如存储到数据库或文件中?
      处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
      25 1
      |
      27天前
      |
      存储 SQL 关系型数据库
      Pandas与数据库交互:实现高效数据交换与存储
      【4月更文挑战第16天】本文介绍了Pandas与数据库交互的方法,包括使用`read_sql`和`to_sql`函数连接SQLite、MySQL等数据库。为了提升数据交换效率,建议采用批量操作、优化SQL查询和使用事务。在数据存储优化方面,选择合适的数据类型、压缩数据以及使用分区或分片都是有效策略。通过这些方法,可实现Pandas与数据库间高效、可靠的数据处理和分析。