存储 笔记

1. 存储笔记

1.1. 行式存储和列式存储

  • 行式存储就是每一行的所有数据存在一个 block 中, 各个 block 之间连续存储;
  • 列式存储就是每一列的所有数据存在一起, 不同列之间可以分开存储;
  1. 列式存储是非关系型数据库中的一种, 非关系型数据库的目的在于去掉关系数据库的关系型特性, 使得数据之间无关系, 使得扩展性高。非关系型数据库一般具有大数据量、高性能的特点, 典型的有 Key-Value 键值存储数据库等。
  2. 行存储、列存储, 最终都需要把数据存到磁盘块。行存储优点很明显, 更新快、单条记录的数据集中, 适合事务。但缺点也很明显, 查询慢。列存储的优势其实是在查询和聚合运算。之所以说行存储适合事务, 其实是相对的, 是因为列存储非常不适合事务。试想一下, 你更新一个表的若干个数据, 如果要在不同块中更新, 就可能产生多次更新操作。更新次数越多, 保证一致性越麻烦。在单机环境我们可以上锁, 可以用阻塞队列, 可以用屏障……但是分布式场景中保证一致性(特别是强一致性)开销很大。因此我们说行存储适合事务, 而列存储不适合。
-Row-Store (行式存储)Column-Store (列式存储)
写入每一行的所有字段都存在一起, 优点: 对数据进行插入和修改操作很方便当一条新数据到来, 每一列单独存储, 缺点: 插入和修改操作麻烦
查询查询时即使只涉及某几列, 所有数据也都会被读取; 优点: 适合随机查询; 在整行的读取上, 要优于列式存储; 缺点: 行式存储不适合扫描, 这意味着要查询一个范围的数据查询时只有涉及到的列会被读取; 缺点: 查询完成时, 被查询的列要重新进行组装
寻道范围读取数据的时候硬盘寻址范围很大由于仅对需要的列进行查找, 因此硬盘寻道范围小
索引缺点: 要加速查询的话需要建立索引, 建立索引需要花费很多时间。优点: 任何列都能作为索引(每一列单独存储, 查询个别列的时候, 可以仅读取需要的那几个列, 相当于为每一列都建立了索引)
压缩缺点: 不利于压缩把一列数据保存在一起, 而一列的数据类型相同; 优点: 利于压缩
空间按行存储, 不利于压缩, 压缩比较差, 占空间大列式存储的时候可以为每一列创建一个字典, 存储的时候就仅存储数字编码即可, 降低了存储空间需求
聚合不利于聚合操作按列存储, 利于数据聚合操作
应用MySQL 中的 iInnoDB 和 MyISAM 存储引擎是行式存储MySQL 中的 infobright 存储引擎是列式存储
使用场景OLTP(存储关系型数据, 用于使用数据的时候需要经常用到数据之间的依赖关系的场景, 即读取的时候需要整行数据或者整行中大部分列的数据, 需要经常用到插入、修改操作)OLAP(分布式数据库和数据仓库, 适合于对大量数据进行统计分析, 列与列之间关联性不强, 仅进行插入和读取操作的场景)

Column-Store 的优点不止在于它的存储格式, 查询引擎层的各种优化也同样关键, 而由于 Row-Store 本身存储格式的限制, 即使在 Row-Store 上使用这些优化, 效果也不好。

1.2. 行式数据库和列式数据库

传统行式数据库的特性如下:

  1. 数据是按行存储的。
  2. 没有索引的查询使用大量 I/O。比如一般的数据库表都会建立索引, 通过索引加快查询效率。
  3. 建立索引和物化视图需要花费大量的时间和资源。
  4. 面对查询需求, 数据库必须被大量膨胀才能满足需求。

列式数据库的特性如下:

  1. 数据按列存储, 即每一列单独存放。
  2. 数据即索引。
  3. 只访问查询涉及的列, 可以大量降低系统 I/O。
  4. 每一列由一个线程来处理, 即查询的并发处理性能高。
  5. 数据类型一致, 数据特征相似, 可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的, 所以可以大幅度提高压缩比, 有利于存储和网络输出数据带宽的消耗。

1.3. 参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云满笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值