1.关系型数据库缺点
1.1.大数据场景下 I/O 较高
因为数据是按 行存储,即使只针对其中 某一列 进行运算,关系型数据库也会对 整行数据 进行扫描,从存储设备中 读入内存,导致 I/O 较高
1.2.结构化存储 不够灵活
存储的是 行记录,无法存储 灵活的数据结构
1.3.表结构 schema 扩展不方便
如要需要修改 表结构,需要执行执行 DDL(data definition language)语句修改,修改期间会导致 锁表,部分服务不可用
1.4.全文搜索 功能较弱
关系型数据库只能够进行 子字符串 的 匹配查询,当表的数据逐渐变大的时候,即使在有 索引 的情况下,like 扫表查询的匹配会 非常慢
1.5.难以 存储 和 处理 复杂 关系型数据
传统的关系数据库,并不擅长处理 数据点之间 的关系
NoSQL 在许多方面性能大大优于 非关系型 数据库的同时,往往也伴随一些特性的缺失。比较常见的是 事务功能 的缺失。
针对传统 关系型数据库 的不足,下面介绍常见的 5 大类 NoSQL 解决方案:
2.NoSQL方案类型
2.1 列式数据库
列式数据库 是以 列相关存储架构 进行数据存储的数据库,主要适合于 批量数据处理 和 即时查询。相对应的是 行式数据库,数据以 行相关的存储架构 进行空间分配,主要适合于 小批量 的 数据处理,常用于 联机事务型数据处理。
基于列式数据库的 列存储特性,可以解决某些特定场景下 关系型数据库 高 I/O 的问题。
HBase
运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。因此,它可以 容错地 存储 海量稀疏 的数据
BigTable
基于 Google 文件系统(Google File System,GFS)的数据存储系统,用于存储 大规模结构化数据,适用于云计算
优点:1.高效的储存空间利用率
2.查询效率高
3.适合做聚合操作
4.适合大量的数据而不是小数据
缺点:1.不适合扫描 小量数据
2.不适合 随机的更新
3.不适合做含有删除和更新的 实时操作
4.单行数据 支持 ACID 的 事务操作,多行数据 的 事务操作,不支持事务的 正常回滚,支持 (Isolation)隔离性、(Durability)持久性,不能保证 (Atomicity)原子性、(Consistency)一致性
2.2 K-V数据库
使用 键值(key-value)存储的数据库,其数据按照 键值对 的形式进行 组织、索引 和 存储。
KV 存储非常适合不涉及过多 数据关系 业务的数据。它能够有效减少 读写磁盘 的次数,比 SQL 数据库存储 拥有更好的 读写性能,能够解决 关系型数据库 无法存储 数据结构 的问题。
Redis
Redis 是一个使用 ANSI C 编写的 开源、支持网络、基于内存、可选持久性 的 键值对存储 数据库。Redis 是目前最流行的 键值对存储 数据库之一
Cassandra
Apache Cassandra(社区内一般简称为 C*)是一套 开源的分布式 NoSQL 数据库系统。它最初由 Facebook 开发,用于储存 收件箱 等简单格式数据,集 Google BigTable 的 数据模型 与 Amazon Dynamo 的 完全分布式 架构于一身。Cassandra 是一种流行的 分布式结构化 数据存储方案
Memcached
Memcached 是一个 开放源代码、高性能、分配的 内存对象缓存系统。用于加速动态 web 应用程序,减轻关系型数据库负载。它可以应对 任意多个连接,使用 非阻塞的网络 IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个 Hash 表,Memcached 自管理这些 Hash 表。
LevelDB
LevelDB 是一个由 Google 所研发的 键/值对(Key/Value Pair)嵌入式 数据库管理系统 编程库,以开源的 BSD 许可证发布。
**优点:1.性能极高
2.丰富的数据类型
3.丰富的特性
**缺点:事务 不能支持 原子性 和 持久性(A 和 D),只支持 隔离性 和 一致性(I 和 C)。
2.3 文档型数据库
文档数据库 用于将 半结构化数据 存储为 文档 的一种数据库。文档数据库通常以 JSON 或 XML 格式存储数据。
由于文档数据库的 no-schema 特性,可以 存储 和 读取 任意数据。
MongoDB
MongoDB 是一个基于 分布式文件存储 的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的 高性能 数据存储解决方案。MongoDB 是一个介于 关系数据库 和 非关系数据库 之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的 NoSQL。
CouchDB
CouchDB 是用 Erlang 开发的 面向文档 的 分布式 数据库,用于存储 半结构化 的数据,比较类似 lucene 的 index 结构。CouchDB 支持 RESTful API,它使用 JSON 作为 存储格式,JavaScript 作为 查询语言,MapReduce 和 HTTP 作为 API 的 NoSQL 数据库。其中一个显著的功能就是 多主复制 功能。除此之外,CouchDB 构建在强大的 B- 树储存引擎 之上。
**优点:1.新增字段简单不需要像关系型数据库一样,先执行 DDL 语句 修改表结构,程序代码 直接读写 即可。
2.容易兼容 历史数据。对于历史数据,即使没有新增的字段,也不会导致错误,只会返回 空值,此时 代码兼容处理 即可。
3.容易存储复杂数据。JSON 是一种强大的 描述语言,能够描述复杂的 数据结构
**缺点:1.Atomicity(原子性):仅支持 单行/文档级原子性,不支持 多行、多文档、多语句原子性。
2.Isolation(隔离性):隔离级别仅支持 已提交读(Read committed)级别,可能导致 不可重复读,幻读 的问题。
3.不支持 复杂查询。例如 join 查询,如果需要 join 查询,需要 多次操作数据库。
2.4 全文搜索引擎
全文搜索引擎 的技术原理称为 倒排索引(inverted index),是一种 索引方法,其基本原理是建立 单词 到 文档 的索引。与之相对是,是 正排索引,其基本原理是建立 文档 到 单词 的索引。
全文搜索引擎的出现,正是解决关系型数据库 全文搜索较弱 的问题。
ElasticSearch
ElasticSearch 是一个基于 Apache Lucene 的 搜索引擎。它提供了一个 分布式,多租户 对全文搜索引擎。ElasticSearch 是用 Java 开发的,对外提供 RESTful Web 接口。根据 DB-Engines 排名,ElasticSearch 是最受欢迎的 企业搜索引擎。
Solr
Solr 是 Apache Lucene 项目的 开源企业搜索平台。其主要功能包括 全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及 富文本(比如 Word、PDF)处理等等。Solr 是高度 可扩展 的,并提供了 分布式搜索 和 索引复制
**优点:1.查询效率高,适用于对 海量数据 进行 近实时 的处理。
2.可扩展性
3.基于 集群 环境可以方便 横向扩展,可以承载 PB 级的数据。
4.支持 高可用,ElasticSearch 集群弹性灵活,可以发现新的或失败的节点,重组 和 重新平衡 数据,确保数据是 安全 和 可访问的
**缺点:1.事务的 ACID 支持不足,单一文档 的数据是支持 ACID 的。对于 多个文档 的 事务操作,不支持事务的 正常回滚。支持(Isolation)隔离性(基于 乐观锁机制)和(Durability)持久性,不支持(Atomicity)原子性,(Consistency)一致性。
2.对类似数据库中,通过 外键 进行 多表关联的复杂操作支持较弱。
3.读写 有一定 延时,写入的数据,最快 1s 中能被检索到。
4.更新 性能较低,底层实现是 先删数据,再 插入新数据。
5.内存占用大,因为 Lucene 将 索引部分 加载到 内存 中。
2.5 图形数据库
图形数据库 应用 图形理论 存储 实体 之间的 关系信息。最常见例子就是 社会网络中人与人之间的关系。关系型数据库 用于存储这种 关系型数据 的效果并不好,其查询 复杂、缓慢、超出预期。
图形数据库 的独特设计弥补了这个缺陷,解决 关系型 数据库 存储 和 处理复杂关系型数据 功能较弱的问题。
Neo4j
Neo4j 是一个 高性能的,NOSQL 图形数据库,它将 结构化数据 存储在 “图形网络上” 而不是 “表中”。它是一个 嵌入式的、基于磁盘的、具备完全的 事务特性 的 Java 持久化引擎。Neo4j 也可以被看作是一个 高性能的图引擎。程序员工作在一个 面向对象的、灵活的网络结构 下而不是 严格、静态 的 表中。
ArangoDB
ArangoDB 是一个 原生多模型 数据库系统。数据库系统支持 三个 重要的 数据模型(键/值,文档,图形)。ArangoDB 包含一个 数据库核心 和 统一查询语言 AQL(ArangoDB 查询语言)。查询语言是 声明性的,允许在 单个查询 中 组合 不同的 数据访问模式。ArangoDB 是一个 NoSQL 数据库系统,但 AQL 在很多方面与 SQL 都类似。
**优点:1.高性能表现
2.设计的灵活性
3.开发的敏捷性
4.完全支持ACID
**缺点:1.节点,关系 和它们的 属性 的数量被 限制。
不支持 拆分。
3.关系数据库 or NoSQL
关于 关系型数据库 和 NoSQL 数据库 的选型,往往需要考虑几个指标:数据量、并发量、实时性、一致性要求、读写分布、数据类型、安全性、运维成本。
| 系统类型 | 数据库选型 |
|---|---|
| 企业内部管理系统 | 例如运营系统,数据量少,并发量小,首选考虑 关系型数据库 |
| 互联网大流量系统 | 例如电商单品页,后台考虑选 关系型数据库,前台考虑选 内存型数据库 |
| 日志型系统 | 原始数据 考虑选 列式数据库,日志搜索 考虑选 倒排索引 |
| 搜索型系统 | 例如站内搜索,非通用搜索,商品搜索,后台考虑选 关系型数据库,前台考虑选 倒排索引 |
| 事务型系统 | 例如库存管理,交易,记账,考虑选 关系型数据库 + 缓存数据库 + 一致性型协议 |
| 离线计算 | 例如大量数据分析,考虑选 列式数据库 或者 关系型数据库 都可以 |
| 实时计算 | 例如实时监控,可以考虑选 内存型数据库 或者 列式数据库 |
4.参考资料
参考:https://blog.csdn.net/baidu_22254181/article/details/82594116