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

文章目录

    • 存储方式对比
    • 优缺点对比
      • 简单对比
      • 行式存储
          • 行式存储的优点
          • 行式存储的缺点
      • 列式存储
          • 列式存储的优点
          • 列式存储的缺点
    • 适用场景对比
    • 参考

存储方式对比

行式存储和列式存储的区别_第1张图片
行式存储就是每一行的所有数据存在一个block中,各个block之间连续存储;列式存储就是每一列的所有数据存在一起,不同列之间可以分开存储。

MySQL中的infobright存储引擎是列式存储,InnoDB和MyISAM存储引擎是行式存储。

列式存储是非关系型数据库中的一种,非关系型数据库的目的在于去掉关系数据库的关系型特性,使得数据之间无关系,使得扩展性高。非关系型数据库一般具有大数据量、高性能的特点,典型的有Key-Value键值存储数据库等。

HBase严格来说不算是列式存储,有人称其为面向列式的存储,其具体存储方式见这篇文章:五分钟轻松了解Hbase面向列的存储–李新杰的博客园

优缺点对比

简单对比

/ 行式存储 列式存储
优点 > 数据被保存在一起,
> INSERT/UPDATE容易
> 查询时只有涉及到的列会被读取,
> 投影(projection)很高效,
> 任何列都能作为索引
优点 > 选择(Selection)时即使只涉及某几列,所有数据也都会被读取 > 选择完成时,被选择的列要重新组装,
> INSERT/UPDATE比较麻烦

行式存储

行式存储的优点
  • 因为每一行的所有字段都存在一起,因此对数据进行插入(INSERT)和修改(UPDATE)操作很方便。
  • 整表查询比较方便,可以很快将整张表组装出来。
行式存储的缺点
  • 查询(SELECT)时如果涉及到某条数据,需要把该行数据所有内容都读取到内存中,即使只SELECT一两个字段也要把整行数据都读进来。
  • 由于上面的原因,读取数据的时候硬盘寻址范围很大。
  • 要加速查询的话需要建立索引,建立索引需要花费很多时间。
  • 空值也要占固定的空间。

列式存储

列式存储的优点
  • 每一列单独存储,因此仅SELECT个别列的时候,可以仅读取需要的那几个列,相当于为每一列都建立了索引。
  • 由于上面的原因,对每一列进行统计分析(投影操作)就很方便,比如统计某一列中某个数据出现的频次,某一列的均值,排序等。因此列式存储通常为决策分析的场景服务,且通常都是大数据。
  • 由于仅对需要的列进行查找,因此硬盘寻道范围小。
  • 数据压缩。列式存储的时候可以为每一列创建一个字典,存储的时候就仅存储数字编码即可,降低了存储空间需求,如下面的图片所示。比如某网站存储所有访问该网站的用户的名字、IP、性别、国家等,存储的时候每一列可以生成一个字典,比如国家,数据库中每个不同的国家在字典中就有一个编码,存储的时候就存储那个编码就行,不需要每个数据都存储完整的字符串。
列式存储的缺点
  • SELECT完成时,被选中的数据需要重新组装。
  • 插入(INSERT)和修改(UPDATE)操作比较麻烦。

下图是列式存储压缩数据和读取数据的原理。
行式存储和列式存储的区别_第2张图片
行式存储和列式存储的区别_第3张图片
读取数据的过程,先到字典中查询某个值对应的编码(数字),然后到该列中进行匹配,把多列的查询结果进行与运算就得到了数据表中哪些行的数据是匹配的,然后把这些数据组装起来就得到了查询结果。

适用场景对比

行式存储用于存储关系型数据,用于使用数据的时候需要经常用到数据之间的依赖关系的场景,即读取的时候需要整行数据或者整行中大部分列的数据,需要经常用到插入、修改操作,比如存储用户的注册信息等。

列式存储适合分布式数据库和数据仓库,适合于对大量数据进行统计分析,列与列之间关联性不强,仅进行插入和读取操作的场景,如网站流量统计、用户行为分析等。

参考

列式存储和行式存储的区别–CSDN博客
五分钟轻松了解Hbase面向列的存储–李新杰的博客园

你可能感兴趣的:(MySQL,数据库)