知乎1:https://www.zhihu.com/question/24225007/answer/32091571
https://www.zhihu.com/question/24225007/answer/81501685
本质:非关系型是传统关系型阉割版本,减少功能,提高性能。
非关系型Mysql免费(实际开发足够)。Oracle、DB2、MSSQL是收费。
非关系型优势:
性能高:不需SQL层解析,NOSQL是基于键值对,可以想象成表中的主键和值的对应关系
容易水平扩展:基于键值对,数据之间没有耦合性
关系型优势:
复杂查询:可用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
事务支持:安全性能很高的数据访问要求得以实现。
都在向着另外一个方向进化。例:NOSQL数据库具备SQL数据库复杂查询功能的雏形,比如Couchbase的index以及MONGO的复杂查询。对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国。
SQL数据库也开始慢慢进化,比如HandlerSocker技术的实现,可以在MYSQL上实现对于SQL层的穿透,用NOSQL的方式访问数据库,性能可以上可以达到甚至超越NOSQL数据库。可扩展性上例如Percona Server,实现无中心化的集群。
特性增加会消弱本来优势,如Couchbase的index增加会逐步降低读写性能
一、关系型数据库
关系模型指的就是二维表格模型,关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
常用的概念:
关系:二维表,每个关系都具有一个关系名,就是通常说的表名
元组:行,称为记录
属性:列,称为字段
域:属性的取值范围,某一列的取值限制
关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, ... ... ,属性N),在数据库中成为表结构
优点:
容易理解,使用方便:通用的SQL语言使得操作关系型数据库非常方便
易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
瓶颈
1).高并发读写
硬盘I/O是一个很大的瓶颈,并发性非常高,每秒上万次读写请求时
2).海量数据的高效率读写
张包含海量数据的表中查询,效率是非常低的
3).高扩展性和可用性
难横向扩展的,用户量和访问量与日俱增,没办法像web server和app server通过添加硬件和服务节点来扩展性能和负载能力。24小时不间断服务的网站,对数据库系统进行升级和扩展非常痛苦,需要停机维护和数据迁移。
对网站来说,关系型数据库的很多特性不再需要了:
事务一致性: 维护中开销大
读写实时性: 几秒乃至十几秒之后才看完全可以接受的
复杂SQL: 任何大数据量的web系统,忌讳多个大表关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站(SNS,专指社交网络服务,包括了社交软件和社交网站。),更多的只是单表的主键查询,简单条件分页查询,SQL的功能极大的弱化了。导致性能欠佳的最主要原因是多表的关联查询
二、NoSQL
“no relational”,也就是非关系型数据库了。
数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。
非关系型数据库适合存储一些较为简单的数据,复杂查询的数据,SQL数据库显的更为合适。
2-1.非关系型数据库分类
大部分都是开源的。极高的性能高,主要分以下几类:
1).高性能并发读写的key-value数据库:Redis,Tokyo Cabinet,Flare就是这类的代表
2).海量数据访问的面向文档数据库:海量的数据中快速的查询数据,MongoDB以及CouchDB
3).可扩展性的分布式数据库:可适应数据量的增加以及数据结构的变化
三. 关系型数据库 V.S. 非关系型数据库
关系型事务的一致性:读写操作都是事务,ACID的特点,银行系统。
SNS应用中,一致性不重要,并发读写要求极高,关系型数据库无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,增加一级memcache来静态化网页,而在SNS中,变化太快,memchache已经无能为力了)
固定表结构,扩展性差,SNS系统升级,功能增加,难以应付
数据持久存储,尤其是海量数据的持久存储,还是要关系数据库这员老将。
四、oracle与mysql的区别
一、并发性
mysql:表级锁为主,粒度大,session对表加锁时间过长,让其他session无法更新。InnoDB表可用行级锁,依赖表索引。
oracle:行级锁,粒度小,只是锁定sql需要的资源,数据行上加锁,不依赖索引。并发性好
二、一致性
mysql:只支持read commited隔离级别。一个session读取数据时,其他session不能改,可最后插入。session更新加排它锁,其他session无法访问。
oracle:支持serializable隔离级别,实现高级别的读一致性。每个session提交后其他session才能看到提交的更改。oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。
三、事务
mysql:innodb存储引擎的行级锁的情况下才支持。
oracle:完全支持
四、数据持久性
mysql:默认提交sql语句,但如果更新过程中出现db或主机重启,也许会丢失数据。
oracle:保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
五、提交方式
mysql自动提交。
oracle手动提交。
六、逻辑备份
mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。
oracle逻辑备份时不锁定数据,且备份的数据是一致的。
七、热备份
mysql:myisam的引擎,用mysql自带mysqlhostcopy热备时,需要给表加读锁,影响dml操作。innodb引擎,备份innodb的表和索引,不会备份.frm文件。用ibbackup备份时,日志文件记录备份期间数据变化,不用锁表,不影响其他用户使用数据库。此工具是收费的。innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。
八、sql语句的扩展和灵活性
mysql:对sql语句方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。
oracle:稳重传统一些。
九、复制
mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,配置管理复杂。
十、性能诊断
mysql诊断调优方法较少,主要有慢查询日志。
oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
十一、权限与安全
mysql用户与主机有关,没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
oracle的权限与安全概念比较传统,中规中矩。
十二、分区表和分区索引
oracle成熟
mysql不太成熟稳定。
十三、管理工具
mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
原文:https://blog.csdn.net/oChangWen/article/details/53423301