数据库存储方式--行存储和列存储

目前数据库存储一张表格主要是行存储(Row Storage)和列存储(Column Storage)两种存储方式。

行存储

行存储将表格看作一个个记录,每个记录是一行。以包含订单号、金额、下单时间 3 项的表为例,行存储如下图所示:

如上图所示,在计算机中没有真正的行的概念。行存储本质就是数据一个接着一个排列,一行数据后面马上跟着另一行数据。如果订单表很大,一个磁盘块(Block)存不下,那么实际上就是每个块存储一定的行数。 类似下图这样的结构:

行存储更新一行的操作,往往可以在一个块(Block)中进行。而查询数据,聚合数据(比如求某个月份的订单数),往往需要跨块(Block)。因此,行存储优点很明显,更新快、单条记录的数据集中,适合事务。但缺点也很明显,查询慢

 列存储

 列存储中数据是一列一列存的。还以订单表为例(包含订单号、金额、下单时间),如下图所示:

  从图中我们发现列存储中,每个列的数据都聚集在一起,订单号在一起、姓名在一起、时间在一起、金额也在一起。乍一看这样的结构很低效,比如说你想取出第一条订单,需要取第 1 列的第 1 个数据1001,然后取第 2 列的第 1 个数据小明,以此类推,需要 4 次磁盘读取。特别是更新某一条记录的时候,需要更新多处,速度很慢。那么列存储优势在哪里呢?优势其实是在查询和聚合运算

   在列存储中同一列数据总是存放在一起,比如要查找某个时间段,很有可能在一个块中就可以找到,因为时间是集中存储的。假设磁盘块的大小是 4KB,一条记录是 100 字节, 那么 4KB 可以存 40 条记录;但是存储时间戳只需要一个 32 位整数,4KB 可以存储 1000 个时间。更关键的是,我们可以把一片连续的硬盘空间通过 DMA 技术直接映射到内存,这样就大大减少了搜索需要的时间。所以有时候在行存储需要几分钟的搜索操作,在列存储中只需几秒钟就可以完成。

说明:DMA技术是Direct Memory Access的缩写。其意思是存储器直接访问。它是指一种高速的数据传输操作,允许在外部设备存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。

 总结

 总结一下,行存储、列存储,最终都需要把数据存到磁盘块行存储优点很明显,更新快、单条记录的数据集中,适合事务。但缺点也很明显,查询慢列存储的优势其实是在查询和聚合运算。之所以说行存储适合事务,其实是相对的,是因为列存储非常不适合事务。试想一下,你更新一个表的若干个数据,如果要在不同块中更新,就可能产生多次更新操作。更新次数越多,保证一致性越麻烦。在单机环境我们可以上锁,可以用阻塞队列,可以用屏障……但是分布式场景中保证一致性(特别是强一致性)开销很大。因此我们说行存储适合事务,而列存储不适合。

希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。

扫描下方二维码关注微信公众号,您会收到更多优质文章推送。

 

posted @ 2021-04-16 16:31  JustJavaIt  阅读(2240)  评论(0编辑  收藏  举报