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

列式存储与行式存储:核心区别、优缺点及代表数据库

文章目录

    • 一、核心定义:数据组织方式的本质区别
    • 二、核心区别与优缺点对比
    • 三、代表数据库
      • 1. 行式存储数据库(OLTP为主)
      • 2. 列式存储数据库(OLAP为主)
    • 四、总结:如何选择?

在数据库存储中,行式存储列式存储的核心差异在于数据在磁盘/内存中的组织方式,这种差异直接决定了它们在不同场景下的性能表现。

一、核心定义:数据组织方式的本质区别

数据存储的最小单元是“字段(Column)”,多个字段构成“行(Row)”(即一条完整记录)。两种存储的根本区别在于,优先连续存储“行”还是“列”。

存储类型核心组织逻辑示例(存储3条用户记录:ID、Name、Age)
行式存储按“行”连续存储,一条记录的所有字段紧凑排列1:Tom:20 → 2:Jerry:22 → 3:Alice:18(每条记录的ID/Name/Age连续存)
列式存储按“列”连续存储,同一字段的所有值紧凑排列ID列:1→2→3;Name列:Tom→Jerry→Alice;Age列:20→22→18(每列数据单独连续存)

二、核心区别与优缺点对比

两种存储的优缺点高度依赖场景(如OLTP事务处理、OLAP数据分析),以下从5个关键维度对比:

对比维度行式存储(Row-Based)列式存储(Column-Based)
1. 数据查询效率- 优势:查询完整记录(如查某用户的所有信息)时,只需读取1次连续数据,效率高。
- 劣势:查询部分字段(如仅查所有用户的Age)时,会读取无关字段,产生“数据冗余读取”,效率低。
- 优势:查询部分字段(如统计所有用户的Age平均值)时,仅需读取目标列数据,无冗余,效率极高。
- 劣势:查询完整记录时,需从多个列文件中聚合数据,效率低。
2. 数据压缩效率- 劣势:每行数据字段类型不同(如ID是整数、Name是字符串),重复值少,压缩率低(通常1:2~1:3)。- 优势:同一列数据类型一致(如全是整数/Age),重复值多,可用高效压缩算法(如字典编码、差值编码),压缩率高(通常1:5~1:10),节省存储空间和IO成本。
3. 写入/更新效率- 优势:单条记录写入/更新(如新增1个用户、修改某用户Name)时,只需操作1个连续数据块,原子性好,适合高频事务。
- 劣势:批量更新某列(如给所有用户Age+1)时,需遍历所有行,效率低。
- 劣势:单条记录写入/更新时,需修改多个列文件,操作分散,原子性难保证,不适合高频事务。
- 优势:批量更新某列时,仅需操作1个列文件,效率极高。
4. 适用场景面向事务处理(OLTP):如电商下单、银行转账、用户信息管理,需高频读写单条完整记录。面向数据分析(OLAP):如报表统计、数据挖掘、BI分析,需批量查询/计算部分字段(如“近3个月各品类销售额总和”)。
5. 索引设计常用B+树索引,优化单条记录的查询(如按ID查用户)。较少依赖传统索引,因列存储本身已按列排序,可直接通过列数据的位置快速定位;部分数据库用“位图索引”优化过滤查询。

三、代表数据库

1. 行式存储数据库(OLTP为主)

  • 关系型数据库(RDBMS):几乎所有传统关系库均采用行式存储,因需支持高频事务。
  • MySQL(InnoDB、MyISAM引擎均为行式)
  • PostgreSQL(默认行式存储,可通过插件支持列式)
  • Oracle、SQL Server
  • NoSQL数据库(部分):侧重文档/键值的单条读写。
  • MongoDB(文档型,按文档(行)存储)
  • Redis(键值型,单条键值对对应“行”逻辑)

2. 列式存储数据库(OLAP为主)

  • 专用OLAP数据库:专为大规模数据分析设计。
  • ClickHouse(开源,高性能列式存储,常用于实时数据分析)
  • Vertica(商业,HP旗下,侧重企业级OLAP)
  • Greenplum(开源,基于PostgreSQL的列式存储扩展,支持MPP架构)
  • 云原生数据仓库
  • Amazon Redshift(基于PostgreSQL改造的列式存储数据仓库)
  • Google BigQuery(云原生列式存储,支持大规模SQL分析)
  • 阿里云AnalyticDB、腾讯云TDSQL-C(OLAP版)

四、总结:如何选择?

  • 行式存储:需高频处理单条事务(如增删改查用户记录)、重视数据一致性和原子性。
  • 列式存储:需批量分析数据(如统计、聚合、报表)、重视查询效率和存储成本。

(注:部分数据库支持“混合存储”,如PostgreSQL的cstore_fdw插件、Oracle的“列式压缩”,兼顾部分OLTP和OLAP需求,但核心场景仍偏向其中一种。)

http://www.xdnf.cn/news/17918.html

相关文章:

  • 代码随想录Day51:图论(岛屿数量 深搜广搜、岛屿的最大面积)
  • 第七十二章: AI训练的“新手村”指南:小规模链路构建与调参技巧——从零开始,驯服你的模型!
  • Java面试实战系列【并发篇】- Semaphore深度解析与实战
  • gnu arm toolchain中的arm-none-eabi-gdb.exe的使用方法?
  • 【C#补全计划】委托
  • uniapp 开发微信小程序,获取经纬度并且转化详细地址(单独封装版本)
  • 零基础-动手学深度学习-10.4. Bahdanau 注意力
  • 电脑上练打字用什么软件最好:10款打字软件评测
  • 【学习笔记】Java并发编程的艺术——第10章 Executor框架
  • VUE3 学习笔记2 computed、watch、生命周期、hooks、其他组合式API
  • RecyclerView 性能优化:从原理到实践的深度优化方案
  • 2020 GPT3 原文 Language Models are Few-Shot Learners 精选注解
  • JVM 总览与运行原理:深入Java虚拟机的核心引擎
  • 快速学会什么是gPRC
  • mysql-DDLy语句案例
  • Linux 系统中网络管理
  • vue3 wangeditor5 编辑器,使用方法
  • 高并发场景下限流算法对比与实践指南
  • 【递归、搜索与回溯算法】DFS解决FloodFill算法
  • whisper 语种检测学习笔记
  • 39 C++ STL模板库8-容器1-array
  • 解决hexo deploy报错:fatal: bad config line 1 in file .git/config
  • 跨网络 SSH 访问:借助 cpolar 内网穿透服务实现手机远程管理 Linux
  • 图像识别控制技术(Sikuli)深度解析:原理、应用与商业化前景
  • Vue 组件二次封装透传slots、refs、attrs、listeners
  • 把 AI 装进“冰箱贴”——基于超低功耗语音合成的小屏电子价签
  • StringBoot-SSE和WebFlux方式消息实时推送-默认单向-可增加交互接口
  • C语言中的输入输出函数:构建程序交互的基石
  • 开源数据发现平台:Amundsen Frontend Service 应用程序配置
  • 基于CodeBuddy的2D游戏开发实践:炫酷大便超人核心机制解析