什么是列存储,(MySQL、Oracle、Hadoop)数据库、存储引擎、存储格式总结对比

列存储是将同一列数据连续存放的存储方式,适合OLAP分析场景,核心优势是I/O减少、压缩率高和向量化计算,但单行操作较慢。


MySQL InnoDB是行存储引擎而非MySQL本身;


Oracle默认行存储但支持列存储选项;


Hadoop生态支持列存储格式如ORC。


数据库、存储引擎和存储格式是不同层级概念:数据库是管理系统(如MySQL),存储引擎负责数据物理存取(如InnoDB),存储格式决定磁盘数据排列方式(如Parquet)。


Oracle采用统一存储管理,无MySQL式的可插拔引擎,但提供内存列存储等扩展功能。

什么是列存储


列存储 是一种数据存储方式,它将同一列的数据连续存放在一起,而不是将整行数据挨个存储。


行存储 vs 列存储(直观对比)

行存储 列存储
存储方式 一行所有字段连续存 一列所有值连续存
典型代表 MySQL InnoDB、PostgreSQL ClickHouse、Doris、HBase
适合场景 OLTP(频繁增删改查单行) OLAP(海量数据聚合分析)

举个例子(3行4列):

id name age city
1 张三 25 杭州
2 李四 30 上海
3 王五 28 北京
  • 行存储 :磁盘上存为 1,张三,25,杭州,2,李四,30,上海,3,王五,28,北京(行挨行)

  • 列存储 :磁盘上存为 1,2,3,张三,李四,王五,25,30,28,杭州,上海,北京(列挨列)


列存储的核心优势

  1. I/O 大幅减少 :分析查询(如 SELECT AVG(age))只需读取 age 这一列,跳过其他无关列。

  2. 压缩率极高:同一列数据类型相同、值往往接近(如性别、地区),压缩比可达 10:1 以上。

  3. 向量化计算:CPU 可批量处理整列数据,比逐行处理快得多。


列存储的代价

  • 单行插入/更新慢:要同时写入多个列文件,事务开销大。

  • 不适合 SELECT *:需读取所有列文件,反而比行存储慢。


一句话总结

行存储 = 一镜到底拍电影(适合看全集);列存储 = 按工种剪视频(适合只看某个角色)。你做什么业务,选什么存储。 👍


MySQL InnoDB 就是MySQL吗,还有Oracle和Hadoop都是列存储吗


1. MySQL InnoDB 就是 MySQL 吗?

不是,InnoDB 是 MySQL 的一个存储引擎,不是 MySQL 本身。

  • MySQL = 数据库管理系统(整体框架)

  • InnoDB = MySQL 默认的存储引擎(负责数据实际如何存、怎么读、怎么支持事务)

打个比方:MySQL 像一辆汽车,InnoDB 是它的发动机。你可以换发动机(比如换成 MyISAM 引擎),但车还是那辆车。

MySQL 支持多种存储引擎,常见的有:

  • InnoDB(默认,支持事务、行锁、聚簇索引)

  • MyISAM(不支持事务,表锁,读多写少用)

  • Memory(数据存在内存,重启丢失)


2. Oracle 是列存储吗?

不完全是。Oracle 默认是行存储,但支持列存储选项。

  • 默认行存储:OLTP 场景(事务处理),和 MySQL InnoDB 一样。

  • 可选列存储 :Oracle 提供 In-Memory Column Store 功能,可以在内存中将表以列格式存放,专门加速分析型查询(OLAP)。但这需要额外授权,不是默认开启的。

所以准确说:Oracle 是行存储为主 + 可开启列存储内存加速


3. Hadoop 是列存储吗?

Hadoop 本身不是存储引擎,而是一个分布式计算框架。但 Hadoop 生态里的文件格式支持列存储。

  • Hadoop HDFS 是分布式文件系统,只管存文件,不管行/列。

  • 但在 HDFS 上存数据时,可以选择文件格式

    • 列式存储格式ParquetORC(广泛用于大数据分析,压缩率高、查询快)

    • 行式存储格式:Avro、SequenceFile(适合逐行读写)

所以准确说法是:Hadoop 生态支持列存储格式,但 Hadoop 本身不是列存储。


总结对比

数据库/系统 是否列存储?
MySQL InnoDB ❌ 行存储(默认引擎)
Oracle ⚠️ 行存储为主,支持列存储内存选项
Hadoop ⚠️ 本身是文件系统,生态中的 Parquet/ORC 是列存储格式

一句话收尾:别把"数据库"和"存储引擎"、"存储格式"混为一谈,它们是不同层级的概念。你问这三个,说明已经在往底层原理走了,方向很对!👍


总结 "数据库"和"存储引擎"、"存储格式"


以下是三者的层级对比表格,帮你彻底厘清概念:


对比维度 数据库 (Database) 存储引擎 (Storage Engine) 存储格式 (Storage Format)
概念层级 最高层:数据管理系统 中间层:数据库内部的组件 最底层:数据在磁盘/内存中的排列方式
本质定义 提供增删改查、事务、权限等完整功能的软件 负责"数据如何物理读写"的核心模块 数据文件在磁盘上的具体编码和布局
作用范围 管理多个库、多张表 单张表级别的数据操作 单个数据块/文件级别的存储结构
可替换性 替换成本极高(如 MySQL → PostgreSQL) 同一数据库可换引擎(如 MySQL 的 InnoDB → MyISAM) 同一引擎可支持多种格式(如 Hadoop 的 Parquet/ORC/Avro)
典型例子 MySQL、Oracle、PostgreSQL、ClickHouse InnoDB、MyISAM、RocksDB、Memory Parquet、ORC、Avro、行格式(REDUNDANT/COMPACT)
决定什么 决定功能特性(SQL支持、隔离级别、高可用) 决定性能特性(事务、锁粒度、并发能力) 决定空间效率、压缩比、I/O扫描代价

层级关系图

text

复制代码
┌─────────────────────────────────────────────────────────┐
│                    数据库(MySQL)                       │  ← 你选择用什么产品
│  ┌───────────────────────────────────────────────────┐  │
│  │            存储引擎(InnoDB)                     │  │  ← 你选择用什么引擎
│  │  ┌─────────────────────────────────────────────┐  │  │
│  │  │         存储格式(行格式/页格式)            │  │  │  ← 引擎内部决定数据怎么落盘
│  │  └─────────────────────────────────────────────┘  │  │
│  └───────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────┘

一句话总结

数据库 是"整车",存储引擎 是"发动机",存储格式是"燃油标号"。你买车(选数据库),选发动机(引擎),加哪种油(格式)由发动机决定,但最终都服务于跑得快不快、稳不稳。👍

Oracle的存储引擎是什么


这个问题的核心区别在于,Oracle不像MySQL那样,允许你为不同的表选择不同的存储引擎

Oracle的架构和MySQL有本质不同,我们可以从下面这个表格来看清区别:

对比维度 Oracle MySQL
内核设计 一体化、封闭的内核,底层存储实现由数据库自身统一管理。 插件式架构,底层存储引擎可插拔、可替换。
用户选项 一个数据库,一种统一的数据存储管理方式。用户不能为单张表选择不同的引擎。 一张表,可选一种存储引擎(如InnoDB或MyISAM)。
核心存储实现 主流采用 HEAP/B-Tree 结构。默认的"堆表"以无序方式存储数据行,并通过B-Tree索引来快速定位。 默认的InnoDB引擎采用B+Tree结构,数据直接按主键顺序存储在聚簇索引的叶子节点上。
关键特性 拥有ROWID(行地址),二级索引直接指向物理行位置,回表效率高。 二级索引存储的是主键值,查询时需回表,多一次主键索引查找。

📌 补充:Oracle中类似"可选引擎"的功能

虽然没有存储引擎的概念,但Oracle提供了一些特殊的存储选项,可以实现类似的效果:

  • In-Memory Column Store(内存列存储) :一个可选的内存功能,能将表数据以列格式存放在内存中,专门加速分析型查询。它和磁盘上的行格式同时存在,互不影响。

  • External Table(外部表):允许数据库直接查询外部文件(如CSV)中的数据,就像查询普通表一样,但不将数据存储在数据库内部。

所以,在谈到Oracle的存储时,更专业的说法是它使用统一的内置存储管理层(基于HEAP表空间),而不是像MySQL那样拥有"可插拔存储引擎"。