关系型数据库与NoSQL数据库场景说明

1

关系型数据库

关系型数据库把所有的数据都通过行和列的二元表现形式表示出来。它的优势:

  • 保持数据的一致性(事务处理)
  • 由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)
  • 可以进行Join等复杂查询
  • 能够保持数据的一致性是关系型数据库的最大优势

关系型数据库的性能非常高,但是它毕竟是一个通用型的数据库,并不能完全适应所有的用途,具体来说它并不擅长以下处理:

  • 大量数据的写入处理。
  • 为有数据更新的表做索引或表结构(schema)变更
  • 字段不固定时应用
  • 对简单查询需要快速返回结果的处理

大量数据的写入处理:

在数据读入方面,由复制产生的主从模式(数据的写入由主数据库负责,数据的读入由从数据库负责),可以比较简单地通过增加从数据库来实现规模化。但是,在数 据的写入方面却完全没有简单的方法来解决规模化问题。例如,要想将数据的写入规模化,可以考虑把主数据库从一套增加到两台,作为互相关联复制的二元主数据 库来使用。确实这样似乎可以把每台主数据库的负荷减少一半,但是更新处理会产生冲突(同样的数据在两台服务器同时更新成其他值),可能会造成数据的不一 致。为了避免这样的问题,就需要把每个表的请求分别分配给合适的主数据库来处理,这就不那么简单了。

另外也可以考虑把数据库分割开来,分别放在不同的数据库服务器上,比如将这个表放在这个数据库服务器上,那个表放在那个数据库服务器上,数据库分割可以减少 每台数据库服务器上的数据量,以便减少硬盘I/O处理,实现内存上的高速处理,效果非常显著。但是,由于分别存储在不同服务器上的表之间无法进行JOIN 处理,数据库分割的时候就需要预先考虑这些问题。数据库分割后,如果一定要进行JOIN处理,就必须要在程序中进行关联,这是非常困难的。

为有数据更新的表做索引或表结构(schema)变更

在使用关系型数据库时,为了加快查询速度需要创建索引,为了增加必要的字段就一定需要改变表结构。为了进行这些处理,需要对表进行共享锁定,这期间数据变更 (更新、插入、删除等)是无法进行的。如果需要进行一些耗时操作(例如为数据量比较大的表创建索引或者是变更其表结构),就需要特别注意:长时间内数据可 能无法进行更新。

共享锁:其他连接可以对数据进行读取但是不能修改数据,是读锁。

排他锁:其他连接法务对数据进行读取和修改操作,是写锁。

字段不固定时的应用

如果字段不固定,利用关系型数据库也是比较困难的。加字段在实际运用中每次都进行反复的表结构变更时非常痛苦的。你也可以预先设定大量的预备字段,但这样的话,时间一长很容易弄不清楚字段和数据的对应状态(即哪个字段保存哪些数据),所以并不推荐使用。

对简单查询需要快速返回结果的处理

关系型数据库并不擅长对简单的查询快速返回结构。因为关系型数据库是使用专门的SQL语言进行数据读取的,它需要对SQL语言进行解析,同时还有对表的锁定 和解锁这样的额外开销。这里并不是说关系型数据库的速度太慢,而只是想告诉大家若希望对简单查询进行高速处理,则没有必要非用关系型数据库不可。

关系型数据库应用广泛,能进行事物处理和JOIN等复杂处理。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。

2

NoSQL数据库

NoSQL数据库原本就不支持JOIN处理,各 个数据都是独立设计的,很容易把数据分散到多个服务器上。由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作, 处理起来也更加容易。同理,数据的读入操作当然也同样容易。所以它的优点是易于数据的分散

提 升处理大数据的能力可以通过两种方式提升性能(纵向)和增大规模(横向),提升性能指的是通过提升现行服务器自身的性能来提高处理能力。这需要的费用较 高。增大规模指的是使用多台廉价的服务器来提高处理能力。它需要对程序进行变更,但由于使用廉价的服务器,可以控制成本。另外,以后只要增加服务器的数量 就可以了。

典型的NoSQL数据库

临时性键值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase)

键值存储

这是最常见的SQL数据库,它的数据是以键值的形式存储的。虽然它的处理速度非常快,但是基本上只能通过键的完全一致查询获取数据。根据数据的保存方式可以分为临时性、永久性和两者兼具3种。

临时性:memcahced把所有数据都保存在内存中,这样保存和读取的速度非常快。

永久性:把数据保存在硬盘上,与memcached在内存中处理数据比起来,由于必然要发生对硬盘的IO操作,所以性能上还是有差距的。

两者兼具:Redis 属于这种类型。Redis首先把数据保存在内存中,在满足特定条件(默认是15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的键发生变 更)的时候将数据写入到硬盘中,这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久性,这种类型的数据库特别适合处理数组类型的数 据,总结来说:

  • 同时在内存和硬盘上保存数据
  • 可以进行非常快速的保存和读取处理
  • 保存在硬盘上的数据不会消失(可以恢复)
  • 适合于处理数组类型的数据

面向文档的数据库

MongoDB、CouchDB属于这种类型,它们属于NoSQL数据库,但与键值存储相异。

  1. 不定义表结构:即使不定义表结构,也可以像定义了表结构一样使用,还省去了变更表结构的麻烦。
  2. 可以使用复杂的查询条件:跟键值存储不同的是,面向文档的数据库可以通过复杂的查询条件来获取数据,虽然不具备事务处理和Join这些关系型数据库所具有的处理能力,但初次以外的其他处理基本上都能实现。

面向列的数据库:普通的关系型数据库都是以行为单位来存储数据的,擅长进行以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被称为面向行的数据库。面向列的数据库以列为单位,对大量行少数列进行读取,对所有行的特定列进行同时更新。

面向列的数据库具有高扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,利用面向列的数据库的优势,把它作为批处理程序的存储器来对大量数据进行更新也是非常有用的。

面向列的数据库

Cassandra、HBae、HyperTable属于这种类型,由于近年来数据量出现爆发性增长,这种类型的NoSQL数据库尤其引入注目。

普通的关系型数据库都是以行为单位来存储数据的,擅长以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被成为面向行的数据库。相反,面向列的数据库是以列为单位来存储数据的,擅长以列为单位读入数据。

面 向列的数据库具有搞扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,把它作为批处理程 序的存储器来对大量数据进行更新也是非常有用的。但由于面向列的数据库跟现行数据库存储的思维方式有很大不同,故应用起来十分困难。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构

2018年一线互联网公司Java高级面试题总结JVM分布式专题架构福利

4424
来自专栏何俊林

美团猫眼电影Android模块化实战总结

首先一句话概括:我想把这几个月做的事情记录下来,并且希望尽量详细,希望读者读了这篇文章能够知道项目进行模块化,项目改业务框架可能会遇到哪些问题,具体每个步骤都做...

3312
来自专栏软件开发 -- 分享 互助 成长

SecureCRT访问开发板linux系统

前言:     最近在用OK6410开发板跑linux系统,经常在终端上敲一些指令,无奈开发板屏幕太小用起来非常不方便,所以使用终端一款能运行在windows上...

2286
来自专栏IT 指南者专栏

指南者博客测试版正式上线,没有域名,只有IP,欢迎访问!

指南者博客访问地址: http://120.79.207.130/ 其实是有域名的,由于没有备案的原因,访问一个月后,基本就不可以访问了,详情如下图。 ? 因...

3718
来自专栏CSDN技术头条

调试大规模服务器集群的五大策略

随着互联网迅速发展,用户访问量以及服务器规模的越来越大,因此,创建一个可靠、稳定、优质的互联网服务是开发者的首要目标。而对于开发者而言,是否具备一个完善的服务器...

2699
来自专栏蓝天

apache thrift的不足

thrift作为RPC优点明显,那些还在坚持使用消息排斥RPC的同学,都应当亲自接触体验一下。 

1011
来自专栏VMCloud

【腾讯云的1001种玩法】构建企业级应用环境之数据层面优化(一)

本系列为两年前 VMCloud 云平台的进阶篇,本次借助 QCloud 的《1001种玩法》活动来继续完成进阶篇,主要以在 QCloud 上搭建一个完整的应用环...

1.3K0
来自专栏CSDN技术头条

SQL事务隔离实用指南

您可能已经在数据库的文档中看到了隔离级别,感到有些手足无措。很少有日常使用事务的例子真正提到了隔离。大多数使用数据库的默认隔离级别,并希望获得最好的隔离级别。这...

1998
来自专栏杨建荣的学习笔记

关于数据库无法登录的问题反思(r6笔记第49天)

昨天接到了同事的一个电话,说有一个数据库无法访问了,希望能够让我来看看,赶紧连过去,发现错误还是一个看似很简单的ora错误。 $ sqlplus / as sy...

2815
来自专栏向治洪

android mtp简介

经作者同意,转发我们公司MTP专家同事huirong的一篇文章。大家也可在程序员第5期看到。 MTP in Android MTP的全称是Media Tra...

4586

扫码关注云+社区

领取腾讯云代金券