- 海量数据无限存储,PB级别数据随便存,底层基于HDFS(Hadoop文件系统),数据持久化
- 读写性能好,只要没有滥用造成数据热点,读写基本随便玩
- 横向扩展在关系型数据库及非关系型数据库中都是最方便的之一,只需要添加新机器就可以实现数据容量的线性增长,且可用在廉价服务器上,节省成本
- 本身没有单点故障,可用性高
- 可存储结构化或者半结构化的数据
- 列数理论上无限,HBase本身只对列族数量有要求,建议1~3个
- HBase是Hadoop生态的一部分,因此它本身是一款比较重的产品,依赖很多Hadoop组件,数据规模不大没必要用,运维还是有点复杂的
- KV式,不支持条件查询,或者说条件查询非常非常弱吧,HBase在Scan扫描一批数据的情况下还是提供了前缀匹配这种API的,条件查询除非定义多个RowKey做数据冗余
- 不支持分页查询,因为统计不了数据总数
文档型NoSql(代表----MongoDB)坦白讲,根据我的工作经历,文档型NoSql我只有比较浅的使用经验,因此这部分只能结合之前的使用与网上的文章大致给大家介绍一下 。
什么是文档型NoSql呢,文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML格式存储数据,因此文档型NoSql是没有Schema的,由于没有Schema的特性,我们可以随意地存储与读取数据,因此文档型NoSql的出现是解决关系型数据库表结构扩展不方便的问题的 。
MongoDB是文档型NoSql的代表产品,同时也是所有NoSql产品中的明星产品之一,因此这里以MongoDB为例 。按我的理解,作为文档型NoSql,MongoDB是一款完全和关系型数据库对标的产品,就我们从存储上来看:
文章插图
看到,关系型数据库是按部就班地每个字段一列存,在MongDB里面就是一个JSON字符串存储 。关系型数据可以为name、phone建立索引,MongoDB使用createIndex命令一样可以为列建立索引,建立索引之后可以大大提升查询效率 。其他方面而言,就大的基本概念,二者之间基本也是类似的:
文章插图
因此,对于MongDB,我们只要理解成一个Free-Schema的关系型数据库就完事了,它的优缺点比较一目了然,优点:
- 没有预定义的字段,扩展字段容易
- 相较于关系型数据库,读写性能优越,命中二级索引的查询不会比关系型数据库慢,对于非索引字段的查询则是全面胜出
- 不支持事务操作,虽然Mongodb4.0之后宣称支持事务,但是效果待观测
- 多表之间的关联查询不支持(虽然有嵌入文档的方式),join查询还是需要多次操作
- 空间占用较大,这个是MongDB的设计问题,空间预分配机制 + 删除数据后空间不释放,只有用db.repairDatabase()去修复才能释放
- 目前没发现MongoDB有关系型数据库例如MySql的Navicat这种成熟的运维工具
总结:数据库与NoSql及各种NoSql间的对比最后一部分,做一个总结,本文归根到底是两个话题:
- 何时选用关系型数据库,何时选用非关系型数据库
- 选用非关系型数据库,使用哪种非关系型数据库
文章插图
第一点,不多解释应该都理解,非关系型数据库都是通过牺牲了ACID特性来获取更高的性能的,假设两张表之间有比较强的一致性需求,那么这类数据是不适合放在非关系型数据库中的 。
第二点,核心数据不走非关系型数据库,例如用户表、订单表,但是这有一个前提,就是这一类核心数据会有多种查询模式,例如用户表有ABCD四个字段,可能根据AB查,可能根据AC查,可能根据D查,假设核心数据,但是就是个KV形式,比如用户的聊天记录,那么HBase一存就完事了 。
这几年的工作经验来看,非核心数据尤其是日志、流水一类中间数据千万不要写在关系型数据库中,这一类数据通常有两个特点:
推荐阅读
- Linux安装Mysql解决中文乱码
- mysql典型的超时异常你见过几种?
- 一文看懂mysql两种join连接算法--NLJ和BNL
- mysql 大批量插入解决方案
- MIUI 12稳定版值得更新吗?10.8万米粉告诉你真实体验,看完就懂
- 手机充电器一直插在插座上会耗电吗?看完文章终于懂了!
- 如何解决MySQL order by limit语句的分页数据重复问题?
- 神奇的 SQL 之子查询
- SQL如何统计字符出现次数?
- MYSQL关于find_in_set函数的使用详解和like的区别之处