一、行式存储和列式存储的优点缺点(从应用上)
1. . 行式存储(如 MySQL 的 InnoDB)
存储特点:整行数据连续存储(一行中的所有列紧挨着存放)。
优点:适合 “按行查询 / 修改” 场景
示例 1:查询单条完整记录
sq
-- 需求:查询ID=100的用户的所有信息(姓名、年龄、地址、电话等)
SELECT * FROM users WHERE id = 100;
- 行式存储优势:只需一次 IO 操作就能读取整行数据(所有列连续存储),效率极高(毫秒级)。
- 列式存储劣势:需要读取多个列的存储块并拼接,IO 次数多,效率低。
示例 2:更新单行数据
-- 需求:修改用户的手机号和地址
UPDATE users SET phone = '138xxxx', address = '北京市' WHERE id = 100;
- 行式存储优势:行级锁只需锁定一行,修改后一次性写入整行,操作简单高效。
- 列式存储劣势:需修改两个列的存储块,可能涉及多个锁和 IO 操作,效率低且容易引发冲突。
2. 列式存储(如 ClickHouse)
存储特点:同一列的数据连续存储(不同行的同一列紧挨着存放)。
优点:适合 “按列聚合分析” 场景
示例 3:对单列进行聚合计算
-- 需求:统计所有用户的平均年龄(只需用到age列)
SELECT AVG(age) FROM users;
- 列式存储优势:只需读取
age列的存储块,无需读取姓名、地址等无关列,IO 量极小(例如 10 亿行数据,仅需读取几十 MB 的age列数据)。 - 行式存储劣势:需扫描全表的所有列,IO 量是列式存储的数倍甚至数十倍(例如每行有 10 列,IO 量增加 10 倍)。
示例 4:多列分组统计sql
-- 需求:按地区统计用户平均年龄和总消费金额(仅需region、age、amount列)
SELECT region, AVG(age), SUM(amount) FROM users GROUP BY region;
- 列式存储优势:仅需读取
region、age、amount三列,且列数据连续存储,可高效利用 CPU 缓存进行计算,适合并行处理。 - 行式存储劣势:需读取所有列的数据,再过滤出需要的列,大量时间浪费在无用数据的 IO 和解析上,大表查询可能耗时分钟级。 </

最低0.47元/天 解锁文章
1071

被折叠的 条评论
为什么被折叠?



