带你读《2022技术人的百宝黑皮书》——数据库存储选型经验总结(3)https://developer.aliyun.com/article/1340014?groupCode=taobaotech
列式 NoSql(代表 —-HBase)
列式 NoSql 和关系型数据库一样都有主键的概念,区别在于关系型数据库是按照行组织的数据,数据字段即使没有值同样占空间,列式存储完全是另一种方式,它是按列进行数据组织的,好处在于:
- 查询时只有指定的列会被读取,不会读取所有列
- 存储上节约空间,空值不会被存储,一列中有时候会有很多重复数据(尤其是枚举数据,性别、状态等字段), 这类数据可压缩
- 列数据被组织到一起,一次磁盘 IO 可以将一列数据一次性读取到内存中
大数据时代最具代表性的技术之一 HBase 就是列式 NoSQL 的产品实现,其优点主要是:
- 海量数据存储,PB 级别数据随便存,底层基于 HDFS(Hadoop 文件系统),数据持久化
- 读写性能好,只要没有滥用造成数据热点,读写基本没任何问题
- 横向扩展在关系型数据库及非关系型数据库中都是最方便的之一,只需要添加新机器就可以实现数据容量的线性增长,且可用在廉价服务器上,节省成本
- 可存储结构化或者半结构化的数据
- 本身没有单点故障,可用性高
- 列数理论上无限制,HBase 本身只对列族数量有要求,建议 1~3 个
缺点主要表现在:
- HBase 是 Hadoop 生态的一部分,因此它本身是一款比较重的产品,依赖很多 Hadoop 组件,数据规模不大没必要用,运维还是有点复杂的。
- 不支持分页查询,因为统计不了数据总数。
- KV 式存储,条件查询很弱,HBase 在 Scan 扫描一批数据的情况下还是提供了前缀匹配这种 API 的,条件查询除非定义多个 RowKey 做数据冗余。
因此 HBase 比较适用于 KV 型存储且未来无法预估数据增长量的场景,另外 HBase 使用还是需要一定的经验,主要体现在 RowKey 的设计上。
文档型 NoSql(代表 —-MongoDB)
文档型 NoSql 指的是将半结构化数据存储为文档的一种 NoSql,文档型 NoSql 通常以 JSON 或者 XML 格式存储数据,因此文档型 NoSql 是没有 Schema 的,由于没有 Schema 的特性,我们可以随意地存储与读取数据,因此文档型 NoSql 的出现是解决关系型数据库表结构扩展不方便的问题的。
MongoDB 是文档型 NoSql 的代表产品,同时也是所有 NoSql 产品中的明星产品之一,它的很多概念与关系数据库类似,因此,对于 MongDB,我们只需要理解成一个 Free-Schema 的关系型数据库就好了,其优点主要是:
- 没有预定义的字段,扩展字段容易
- 相较于关系型数据库,读写性能优越,命中二级索引的查询不会比关系型数据库慢,对于非索引字段的查询则是全面胜出
缺点在于:
- 不支持事务操作,虽然 Mongodb4.0 之后宣称支持事务,但是效果待观测
- 多表之间的关联查询不支持(虽然有嵌入文档的方式),join 查询还是需要多次操作
- 空间占用较大,这个是 MongDB 的设计问题,空间预分配机制 + 删除数据后空间不释放,只有用 db.repair Database () 去修复才能释放
- 目前没发现 MongoDB 有关系型数据库例如 MySql 的 Navicat 这种成熟的运维工具
总而言之,MongDB 的使用场景很大程度上可以对标关系型数据库,但是比较适合处理那些没有 join、没有强一致性要求且表 Schema 会常变化的数据。
通过以上讨论分析我们心中已经有了一个基本的选型框架指导,实际上在数据库选型时回答自己两个核心问题就好了:
- 什么时候选用关系型数据库,什么时候选用非关系型数据库
- 选用非关系型数据库的话,使用哪种非关系型数据库
带你读《2022技术人的百宝黑皮书》——数据库存储选型经验总结(5)https://developer.aliyun.com/article/1340012?groupCode=taobaotech