列存储将同一列数据连续存放,提升分析查询效率与压缩比,但写入性能较差;行存则整行存储,适合事务处理。
SQL数据库里的列存储,核心是把同一列的所有值连续存放在磁盘或内存中,而不是像行存那样把整条记录(比如用户ID、姓名、年龄)捆在一起存。这种“按列组织数据”的方式,直接决定了它在分析类查询中效率高、压缩比大,但在事务写入时更吃力。
假设一张表有三列:user_id(整型)、action(字符串)、ts(时间戳),共100万行数据:
这样做的直接好处是:查“所有action类型分布”,只需读action列那一段;做SUM、AVG、GROUP BY,引擎能顺序扫描同质数据,CPU缓存友好,还能用RLE、字典编码等算法高效压缩。
差异不在“好不好”,而在“适合什么场景”:
SELECT * FROM users WHERE id = 123);列存只加载涉及的列,适合宽表扫描(如SELECT COUNT(*), AVG(age) FROM logs WHERE dt = '2026-01-04');不是所有SQL数据库都原生支持列存,但主流系统已有明确分工或混合能力:
聚集列存储索引)、Oracle(In-Memory Column Store选项)、PolarDB(MySQL版提供行列混合模式);选型时不用纠结“哪个更好”,而要看你主要跑的是UPDATE user SET balance = balance - 100 WHERE id = 888,还是SELECT region, SUM(sales) FROM fact_sales GROUP BY region——前者行存稳,后者列存快。