NoSQL:Not Only SQL,泛指非关系型数据库,是对关系型数据库的一种补充。
常用NoSQL以及代表产品
1. KV型NoSQL(代表–Redis)
最大的优点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可以达到10万级别。 适用缓存的场景:
- 读远多于写;
- 读取能力强;
- 没有持久化需求。
解决了RDBMS中,
热点KV型数据读写QPS高,读性能受高QPS写数据的直接影响问题。
优点:
KV方式读取性能强劲 原子命令的特点可用于实现分布式锁
缺点:
- 数据无法持久化
- 不支持条件查询
- 基于内存,存储空间有限
2. 搜索型NoSQL(代表–ElasticSearch)
搜索型NoSQL是为了解决关系型数据库全文搜索能力较弱的问题(RDBMS全文搜索的场景下,索引是无能为力的)。
全文搜索的原理是倒排索引
解决了RDBMS中
- 条件查询性能高度依赖索引,不支持全文搜索;
- 分库分表后无法对表做全量查询与聚合的问题。
优点:
- 支持丰富的条件查询,支持全文搜索
- 支持Group by,有强大的数据分析能力
- 支持海量数据存储
缺点:
- 性能全靠内存,非常吃硬件资源、吃内存。(数据库中的爱马仕)
- 读写之间有延迟
- 数据结构灵活性不高:字段一旦设定,无法修改类型。修改类型需要重建表
3. 列式NoSQL(代表–HBase)
列式NoSQL是大数据时代最具代表性的技术之一。按照每一列进行组织的数据。磁盘组件为HFile 解决了RDBMS中,海量数据存储后读写性能低问题。
优点:
- 海量数据无限存,PB级别,底层基于HDFS,数据持久化
- 读写性能好,
- 横向扩展方便,
- 自身无单点故障,可用性高
- 可存储结构话或者半结构化数据
- 列数理论无上限,本身支队列族数有要求,建议
1~3个
缺点:
- HBase是Hadoop生态的一部分,依赖Hadoop组件,比较重,运维复杂
- KV式,不支持条件查询(或者说条件查询非常弱)
- 不支持分野查询,因为统计不了数据的总数
- HBase比较适用于KV型的且无法预估数据增长量的场景。
Cassandra也属于列式存储,Cassandra使用了Google设计的BigTable的数据模型,其使用的是宽列存储模型(Wide Column Stores)。磁盘组件为SSTable
4. 文档型NoSQL(代表–MongoDB)
文档型NoSQL指的是将半结构化数据存储为文档的一种NoSQL,文档型NoSQL通常以JSON或者XML格式存储数据,无Schema→可以随意地存储与读取数据,
解决了RDBMS中,数据库schema表结构扩展不方便问题。
优点:
- 无预定义字段,扩展字段容易
- 相较于RDBMS,读写性能优越,命中二级索引的查询不会比RDBMS慢,对于非索引字段的查询更优
缺点:
- 不支持事务,4.0后宣称支持事务
- 多表的关联查询不支持(虽然有嵌入文档的方式),join查询还是需要多次操作
- 空间占用较大,空间预分配机制+删除数据后空间不释放,只能通过db.repairDatabase()修复才能释放
- 目前无成熟的运维工具
5. 图形NoSQL(代表--Neo4j)
图数据库允许我们将数据以图的方式存储,应用图形理论存储实体之间的关系信息。
Janusgraph也属于图形NoSQL,支持事务,支持数千用户实时、并发访问存储在其中的图。