为什么列存储数据库读取速度会比传统的行数据库快?

https://www.zhihu.com/question/29380943


作者:李伟
链接:https://www.zhihu.com/question/29380943/answer/48516239
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果懒得看分析直接看结论:
列存储的数据库更适合OLAP
行存储的数据库更适合OLTP

所谓的快只是针对于进行olap操作而言

我们知道,数据在存储中的基本单位为页,这也是进行数据读取时候基本单位,一次读取就是一次IO操作

以sql server为例,一个数据页大小为8K,数据页中存储的是数据,数据是连续存储的

那么我假设如下的4*4表格为一个数据页


再假设,有这样一个表格 字段1 字段2
字段1的值为 col1value1,col1value2.....
字段2的值为col2value1,col2value2......

再假设一个excel的单元格为一个存储单位,数据总量占了2个页,
那么以行方式存储大概就这样的



以列方式存储则是这样的


这时,如果我需要执行如下查询(oltp典型查询)
select 字段1,字段2 from table where 字段1='col1value1'
以行方式查询(在有适当的索引情况下),那么,执行一次以上查询,只需要扫描一次page1就可以了
以列方式查询,需要投其扫描page1 和page2共2次,分别取得字段1,字段2的单行值

OK,我们换成olap的典型查询
select avg(字段2) from table
--(注意,这里假设字段2为一个整型数据,而且无where条件限制,即需要扫描全部数据)
对于行存储,这个查询需要两次IO将全部数据放入内存后,进行页间数据的跳读(类随机读取)
对于列存储,只需要一次IO将page2放入内存后进行连续读取,如果字段2还有多页的话,也都是进行的物理连续读取

也就是说,在进行olap操作时候,不仅是减小了IO次数,而且把随机读取变为了连续读取
以下为网上随便找的一张SSD性能测试图,注意seq(连续)和4k(随机)之间的性能区别


以上

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值