三分钟,我要SQL、NoSQL、NewSQL的全部资料!

650 阅读7分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

系列文章:

十分钟入门数据库,入不了就把门卸了 - 掘金 (juejin.cn)

正文

sql-no-new.jpg

// 朴实无华的分割线

翻译.png

海豚是 Mysql,大象是 PostgreSQL;叶子是 MongoDB.

三分钟,正文已完,谢谢观看。下面全是闲聊

一、SQL

RDBMS

经过前面的学习,已经知道数据库管理系统,就是管理数据库的系统。

那么关系数据库管理系统 (Relational Database Management System,RDBMS),就是管理关系数据库的系统。

 

什么是关系数据库?

数据库是数据集合;关系数据库是多组相互之间有关系的数据的集合。

比如,下图 actor_id 和 film_id 之间的关系显而易见,它们将这三张表联系在了一起。actor_id 和 first_name 等被定义为字段。

example.png

RDBMS 为数据库提供了图形化的操作界面。不同关系数据库分库,多组关系数据按不同类型定义成为不同的表。

分库分表是为了防止数据杂乱。比如一张表存个1000个字段,肯定找得头晕眼花,反而增加了管理难度。而且这张表如果误删了一条数据,那这1000个字段的数据都没有了。

如果按类型分库分表,一张表里误删了条数据,造成的损失就相比之下较小,因为只删了几个字段的数据。

SQL

有了操作界面还不够,还需要计算机语言来操作关系数据库。

SQL,结构化查询语言 (Structured Query Language),是用来访问、处理的数据库的标准计算机语言。

 

欸,你可能会问,咱们人工查询、新增删除不也行吗,非学这个语言干嘛。

就像前几天双11,人们下订单的手速和订单量多大,那每秒至少十万级的,不可能给你一年手工导数据吧。所以计算机的事,还是交给计算机语言来做吧。

database-administrator.jpg

常见 SQL 数据库:MySQL、SQL Server、PostgreSQL、Oracle、ClickHouse、SQLite 和 DB2等。

区别存在但不限于 SQL 语法、是否开源、数据量级、额外工具等,他们的共同点就是访问和处理关系数据库。

 

二、NoSQL

垂直扩展和水平扩展

说到网上购物,可以用 SQL 来处理这些数据,但当历史数据量增多、并发数据量增大到其难以负荷的地步时,比如百万、千万,就必须进行扩展。

扩展又分为两种:垂直和水平扩展。垂直就是加钱升级一台服务器 (计算机),水平就是加量买一堆服务器。

垂直水平.png

 

单机,即垂直扩展,性能提升不高,且购买金额呈指数级上增,性价比低。

这时候想到水平扩展,水平扩展分为集群和分布式。

集群:将单机复制为几份,并实现负载均衡 (简单地说,将所有需要处理的数据较为均衡的分发给每台服务器),以此提升数据处理能力。

分布式:将系统拆分为多个服务模块,比如将商城拆分成多个独立的服务:用户服务、产品服务、订单服务、后台管理服务、数据分析服务等,将这些服务部署到多台服务器,多台服务器之间相互通信,共享数据。

 

但你会发现 SQL 很难水平扩展。

原因无他 —— relation,关系。

Diagram 1.png

 

如果 SQL 在集群上,每台服务器也必须共享数据,每台服务器依旧要对有关系的所有库和表进行更新,这时每台服务器的负载和单机差距不大;

如果用分布式,就会发现,因为数据库本来由很多有关系的表组成,那放在分布式上即使模块分开了,但是该冗余的数据一点没少,还是拿商城举例,至少用户表每台服务器必备。

为了摆脱 relation 带来的影响,人们创造出了新的数据库,NoSQL.

NoSQL

NoSQL 个人比较喜欢定义为 “No Relation and Not Only SQL”。首先,这种数据库管理的数据之间是没有关系的,所以扩展起来很方便。其次,它具有 SQL 一些没有的能力和性质。

SQL 和 NoSQL 对比:

 SQLNoSQL
可靠性较低
扩展性较低
分布式难以支持支持
SQL支持不支持
海量数据读写较慢较快

NoSQL 牺牲了部分数据一致性,来大量提高数据读写效率和扩展性。

分类:

nosql分类.png

还有对象数据库、时序数据库等。

 

三、NewSQL

NoSQL 虽然解决了 SQL 难以扩展、读写海量数据缓慢的问题,但与此同时可靠性、安全性大大降低,也不支持 SQL。

这时候,人们就想为什么不设计一种数据库,将 SQL 和 NoSQL 取长补短呢?于是,NewSQL 出现了。

NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有 NoSQL 支持分布式和海量数据的存储管理能力,还保持了传统数据库 ACID 和支持 SQL 等特性。

Cloud Spanner

Cloud Spanner为例,浅浅讨论一下 NewSQL 是如何做到保留 SQL 特性的同时还做到高扩展性的。

1. 它的表内结构和SQL是相似的,并支持SQL语言

singers.png

 

2. 提供父子表结构,使多表进行关联

在 Spanner 中定义 “父-子级” 关系的方式有两种:表交错和外键。

平行表,行物理布局:

平行表.png

  父子表:

父子表.png

这时候两表之间的关系为 “Singers(1)”->“Albums(1, 1)”->“Albums(1, 2)”.

 

3. 数据库分片,扩展性高且支持分布式

Spanner 可以定义交错父子关系的层次结构 (最多7层),即可以将7张表的行定位到一起。若表中数据较少,则单个 Spanner 服务器就能处理数据库。

然而,当表不断增长,达到单个服务器的资源限制时,Spanner 会将数据划分为称为 “分片” 的区块。分片包含一系列连续的行。

交错表.png

如上图,“Singers(2)”->“Albums(2, 1)”->“Songs(2, 1, 1)”->“Songs(2, 1, 2)”->“Songs(2, 1, 3)”->“Albums(2, 2)”->“Albums(2, 3)”->“Songs(2, 3, 1)” 是三张表的行形成的连续行。

各分片之间是可以看作没有关系的,关系都包含在分片里面了,此时它更接近于 NoSQL,这也是 Spanner 支持分布式的原因。

各个分片可以彼此独立移动并被分配给不同的服务器,这些服务器可以位于不同的物理位置。连续行范围的开始和结束称为 “分片边界” 。Spanner 会根据大小和负载自动添加和移除分片边界,这会改变数据库中的分片数量。

 

当然这样看来它也有一些缺点:比如限定最多7层结构关系,那设计数据库的时候就必须考虑到关联表数,如果有更多结构是否会出现数据冗余。层级太多也并不利于分片,因为子行的大小如果超出分片大小限制,分片是会将连续行分开的。

所以NewSQL也存在缺陷,这也是未来研究的方向。

NewSQL

属于初生阶段,尚不成熟。目前NewSQL系统大致分三类:

1. 新架构

采取了不同的设计方法,大概分为两类:

(1) 工作在一个分布式集群的节点上,其中每个节点拥有一个数据子集。SQL查询被分成查询片段发送给自己所在的数据的节点上执行。这些数据库可以通过添加额外的节点来线性扩展。现有的这类数据库有:Cloud SpannerVoltDB,Clustrix,NuoDB.

(2) 系统通常有一个主节点的数据源。用来做事务处的节点接到特定的 SQL 查询后,会把它所需的所有数据从主节点上取回来后执行 SQL 查询,再返回结果。

2. SQL引擎

这些系统提供了 MySQL 相同的编程接口,但扩展性比内置的引擎 InnoDB 更好。这类数据库系统有:TokuDB,MemSQL.

3. 透明分片

这类系统提供了分片的中间件层,数据库自动分割在多个节点运行,包括:ScaleBase,dbShards,Scalearc.

 

最后的最后,又回到了文章的开头:

sql-no-new.jpg

 

tips:你问 ACID ?啊,我没戴眼镜,下次丕定

听不清.jpg

 

 

参考:

Mysql拓展知识概括_GeorgeLin98的博客-CSDN博客_mysql扩展内容

关于架构  |  Cloud Spanner  |  Google Cloud

NewSQL_百度百科 (baidu.com)