存储 笔记

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. 参考

猜你喜欢

转载自blog.csdn.net/wan212000/article/details/131332982