🗄️ 第二章 数据的存储方式-关系型数据库的特征
📄 一句话概括

NoSQL 前两族:键值型=一个键对一个值的储物柜(Redis),快到飞起;面向列型=把同列数据打包存放(HBase、Cassandra),海量分析少读没用的数据。

📝 本节和前面几节的关系

2-5 说了 NoSQL 家族的来历和总表;本节细看前两族——它们是家族里【最不像表】的两族,关键词分别是【快】和【省】。

一、键值型:储物柜模型

键值型(Key-Value):每条数据就两个零件——键(Key)+ 值(Value)。

键(唯一)          值
─────────────────────────────
user:1001       →  "{...用户信息...}"
session:abc123  →  "登录状态数据"
pv:2026-09-24   →  87346592

生活原型:超市储物柜——一条数据一把柜子:按键(凭条号)开柜拿包,不用管柜子在哪个角落。柜子按凭条号定位,一找一个准。

代表产品:Redis——最出名的键值型数据库,数据放内存里,取值快到微秒级,常当【缓存】用。

二、键值型强在哪、弱在哪

强:快。

弱:只会按键找。

一句话:按键查=闪电;按键以外的方式查=抓瞎。 用它的前提是想清楚【查询永远按键走】。

三、面向列型:按列打包

关系型表(2-2)在磁盘上是按行存的——张三一整行、李四一整行挨着放。这叫行式存储。

面向列型(Column-Oriented)反过来:按列存——【姓名】这一列的所有值打包放一起,【年龄】这一列再打包放一起。

行式(关系型):  [张三,17][李四,16][王五,18]...
列式(面向列型):[张三,李四,王五,...] [17,16,18,...]

好处立刻显形。想算【全表平均年龄】:

生活原型:图书馆按类分区——要查【所有地理类图书的借阅次数】,直接去地理区翻台账;不用像行式那样把文学区、科技区每个书架都过一遍。

代表产品:HBase、Cassandra——常扛海量日志和用户行为数据。

四、面向列型强在哪、弱在哪

强:批量分析省。

弱:单条读写别扭。

对照记忆:键值型为【点查】而生,面向列型为【扫列分析】而生。

五、动手 Demo:算两种存储的读取量

表:100 万行 × 10 列,每列 10 字节(一行 100 字节)。任务:算【全表某一列的总和】。

  1. 行式:必须整行整行读——读取量 = 100 万 × 100 字节 = 1 亿字节
  2. 列式:只读目标那一列——读取量 = 100 万 × 10 字节 = 1000 万字节
  3. 结论:只读十分之一——列数越多、差距越大(10 列差 10 倍,100 列差 100 倍)

看到什么算成功:能自己算出【1 亿 vs 1000 万】,并说出原因【行式读了大量用不上的列】。

六、30 秒实验

回忆你看过的【年度账单】【运动年报】(支付宝年账单、微信运动年度报告):

七、常见误区

  1. "键值型的值必须是指定类型" —— 不需要,值可以是任意字节串;数据库只管【按键找到】,不管值里装什么。
  2. "面向列型就是把表的列拆开存,还是关系型" —— 组织方式完全不同:它是为【批量扫某几列】设计的专门存储,没有表连接、没有固定 schema 那套关系型规矩。
  3. "列式一定比行式快" —— 分场景:批量聚合列式碾压;单条按主键取完整记录行式更顺(拼一整行一翻就是,列式要跨包凑)。没有万能,只有对症。
自测三问(点开对答案) 1. 键值型的数据长什么样?查询方式有几种? **键+值成对;只有按键取值一种快路**——按值的内容查只能全量扫。 2. 行式与列式存储的区别? **行式按行存(一行挨一行),列式按列打包存(同列值放一起)**。 3. 面向列型最强的场景是什么? **海量数据的批量聚合分析**——只读需要的列,I/O 少一个量级。

相关笔记