当前位置: 首页 > news >正文

行式存储与列式存储

1.概述

  数据处理大致可分为两大类,联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,比如数据库记录的增、删、改、查等。而OLAP则是分布式数据库的主要应用,它对实时性要求不高,但处理的数据量大,通常应用于复杂的动态报表系统上。

2.行式存储与列式存储

2.1 行式存储

  传统的关系型数据库采用行式存储法(Row-based),一行中的数据在存储介质中以连续存储形式存在。

[  {    "title": "Oriented Column Store",    "author": "Alex",    "publish_time": 1508423456,    "like_num": 1024  },{    "title": "Apache Druid",    "author": "Bob",    "publish_time": 1504423069,    "like_num": 10  },{    "title": "Algorithm",    "author": "Casey",    "publish_time": 1512523069,    "like_num": 16  }]

Q: 统计 Bob 发表的博客数,或是整个系统今天的博客点赞数。如果是行存储系统,数据库将怎样操作?

在这里插入图片描述

  行式存储数据库需要将所有行数据读入内存,然后对 like_num 列做 sum 操作,从而得到结果。 此时我们会发现行式数据库在读取数据的时候,会存在一个固有的“缺陷”。比如所选择查询的目标即使只涉及少数几项属性,但由于这些目标数据埋藏在各行数据单元中,而行单元往往又特别大,应用程序必须读取每一条完整的行记录,从而使得读取效率大大降低。

对此,行式数据库给出的优化方案是加“索引”。在OLTP类型的应用中,通过索引机制或给表分区等手段,可以简化查询操作步骤,并提升查询效率。

2.2 行式存储的应用场景

  • 适合随机的增删改查操作
  • 需要在行中选取所有属性的查询操作
  • 需要频繁插入或更新的操作,其操作与索引和行的大小更为相关

2.3 列式存储

  列式存储(Column-based)是相对于行式存储来说的,新兴的HBase,GP等分布式数据库均采用列式存储,一列中的数据在存储介质中以连续存储形式存在。

[  {    "title": "Oriented Column Store",    "author": "Alex",    "publish_time": 1508423456,    "like_num": 1024  },{    "title": "Apache Druid",    "author": "Bob",    "publish_time": 1504423069,    "like_num": 10  },{    "title": "Algorithm",    "author": "Casey",    "publish_time": 1512523069,    "like_num": 16  }]

在这里插入图片描述

统计 Bob 发表的博客数,或是整个系统今天的博客点赞数。如果是行存储系统,数据库将怎样操作?

在这里插入图片描述

对于列的操作,如上面我们说到的统计所有 like_num 之和 ,仅仅只需要读取like_sum列数据进行求和即可。在大数据量查询场景中,列式数据库可在内存中高效组装各列的值,最终形成关系记录集,因此可以显著减少IO消耗,并降低查询响应时间。非常适合数据仓库和分布式的应用。

2.4 列式存储的优势

  • 自动索引
    • 基于列存储,所以每一列本身就相当于索引。所以在做一些需要索引的操作时,就不需要额外的数据结构来为此列创建合适的索引。
  • 利于数据压缩
    • 相同的列数据类型一致,这样利于数据结构填充的优化和压缩,而且对于数字列这种数据类型可以采取更多有利的算法去压缩存储。
http://www.lryc.cn/news/141906.html

相关文章:

  • windows上sqlserver的ldf日志文件和数据mdf文件分别放到不同的磁盘
  • vue3+uni——watch监听props中的数据(组件参数接收与传递defineProps、defineEmits)
  • mybatis与spring集成与spring aop集成pagehelper插件
  • Mybatis基础
  • TypeScript-- 配置Typescript环境(1)ts 转js,tsc --watch 实时编译
  • Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库
  • Lottery抽奖项目学习第二章第一节:环境、配置、规范
  • OpenCV之reshape函数
  • 【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制
  • 微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板
  • C++卷积神经网络
  • go 读取yaml映射到struct
  • Redis 10 大数据类型
  • 优化生产流程:数字化工厂中的OPC UA分布式IO模块应用
  • Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索
  • 已解决Gradle错误:“Unable to load class ‘org.gradle.api.plugins.MavenPlugin‘”
  • windows中安装sqlite
  • 前端面试:【系统设计与架构】前端架构模式的演进
  • 【CSS】em单位的理解
  • 无涯教程-Python机器学习 - Based on human supervision函数
  • 【滑动窗口】leetcode209:长度最小的子数组
  • C++ STL unordered_map
  • 全流程R语言Meta分析核心技术应用
  • Go并发可视化解释 - Select语句
  • 在线SM4(国密)加密解密工具
  • golang的类型断言语法
  • 提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长
  • 第3篇:vscode搭建esp32 arduino开发环境
  • Apache Shiro是什么
  • Socket基本原理