zoukankan      html  css  js  c++  java
  • 数据库存储方式--行存储和列存储

    目前数据库存储一张表格主要是行存储(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干预。

     总结

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

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

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

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    T1-TensorFlow基础
    iOS之开发小技巧
    iOS之自定义控件
    plist文件的读取和xib加载cell
    iOS之tabBar随tableView的滑动而隐藏/显现
    iOS之initialize与load
    iOS之九宫格图片
    iOS之ToolBar定制
    iOS之新浪微博的OAuth授权
    Markdown的简单实用
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/14774074.html
Copyright © 2011-2022 走看看