NoSQL数据库比对
SQL和NoSQL概念
SQL:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。该语言以表格的形式从结构化数据格式中操作和检索数据。
NoSQL:NoSQL,泛指非关系型的数据库,提供了一种存储和检索非结构化数据的机制。这种类型的数据库可以处理大量数据,并具有动态模式。因此,NoSQL数据库没有特定的查询语言,没有或只有很少的关系,但是数据以集合和文档的格式存储。
SQL和NoSQL区别
1)数据库类型:SQL之所以称为关系型数据库,是因为它将结构化数据组织定义为行和列,每个表都与数据库中的其他表相关。NoSQL被称为非关系数据库,这是因为数据以集合的形式存储,它们之间没有或只有很少的关系。
2)Schema架构:SQL需要用到结构化数据的预定义架构。因此,在开始使用SQL提取和操作数据之前,需要确保以表的形式预定义数据结构。但是,NoSQL具有用于非结构化数据的动态架构。因此,如果您使用NoSQL数据库,则不存在预定义的架构,数据的完整架构完全取决于您希望存储数据的方式,即您想将哪些字段存储在文档和集合中。
3)数据库类别:SQL数据库是基于表格的数据库。因此您可以有n个相互关联的表,并且每个表可以具有行和列,这些行和列将数据存储在表的每个单元格中。而NoSQL数据库则具有以下几类数据库:
1、文档数据库:将每个密钥与称为文档的复杂数据结构配对。它可以包含许多不同的键值对,甚至嵌套的文档;
2、键值存储:它们是最简单的NoSQL数据库,数据库中的每一项都作为属性名称或键及其值存储。
3、图形存储:它们用于存储有关网络的信息,例如社交关系。图形存储包括Neo4J和HyperGraphDB。
4、宽列存储:Cassandra和HBase等宽列存储针对大型数据集的查询进行了优化,并将数据列而不是行存储在一起。因此,SQL数据库以表的形式存储数据,而NoSQL数据库以键值对,文档,图形数据库或宽列存储的形式存储数据。
4)复杂查询:与NoSQL相比,SQL更适合复杂的查询环境,因为SQL数据库中的架构是结构化的,并且数据以表格格式存储。因此,即使您希望将嵌套查询与外部查询中的许多子查询一起应用,也可以通过使用适当的表名和列名轻松进行。NoSQL数据库不适用于复杂查询的原因是因为NoSQL数据库不是以SQL之类的标准语言查询的。
5)分层数据存储:与SQL数据库相比,NoSQL更适合分层存储。这是因为随着表数量的增加,维护它们之间关系的复杂性也不断增加。因此在这种情况下,您无法将大量的表彼此关联在一起。但是当您考虑使用NoSQL数据库时,这种数据库更适合分层数据存储,因为它遵循类似于JSON数据的键值对存储方式。
6)可扩展性:SQL数据库是垂直可伸缩的。可以通过优化硬件(例如增加CPU,RAM,SSD等)来平衡数据服务器的负载。NoSQL数据库是水平可伸缩的。可以通过向集群添加更多服务器以处理大量流量来执行负载平衡。
7)语言:SQL数据库有特定的语言,不会因为数据库不同而不同。NoSQL数据库没有特定的语言用于查询,会随数据库的变化而变化。在NoSQL数据库中,查询主要集中在文档集合上,该语言称为UnQL(非结构化查询语言)。
8)在线处理:在比较SQL和NoSQL时,基于此因素,SQL数据库用于重事务型应用程序。这是因为SQL提供了数据的原子性,完整性和稳定性。您也可以将NoSQL用于事务目的,但是在高负载和复杂的事务应用程序中,它仍然不够稳定。因此,SQL主要用于OLTP(在线事务处理),而NoSQL主要用于OLAP(在线分析处理)。
9)基本属性:SQL数据库基于ACID属性 (原子性,一致性,隔离性和持久性),而NoSQL数据库基于Brewers CAP定理(一致性,可用性和分区容限)。NoSQL不能同时提供一致性和高可用性。
10)外部支持:自从SQL诞生超过40年以来,所有SQL供应商都提供了出色的支持。但是,对于某些NoSQL数据库,是有限制的,您仍然必须依靠社区支持来部署大规模的NoSQL。这是因为NoSQL于2000年代末期出现,人们尚未对其进行太多发掘。
NoSQL数据库分类
类型 |
部分代表 |
特点 |
列存储 |
Hbase,Cassandra,Hypertable |
顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 |
文档存储 |
MongoDB,CouchDB |
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。 |
key-value存储 |
Tokyo Cabinet / Tyrant,Berkeley DB,MemcacheDB,Redis |
可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) |
图存储 |
Neo4J,FlockDB |
图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
对象存储 |
db4o,Versant |
通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
xml数据库 |
Berkeley DB XML,BaseX |
高效的存储XML数据,并支持XML的内部查询语法,比如XQuery、Xpath。 |
Redis和Memcached区别
1、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。而Memcached只支持简单数据类型,需要客户端自己处理复杂对象。
2、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用(PS:持久化在RDB、AOF)。
3、由于Memcache没有持久化机制,因此宕机所有缓存数据失效。Redis配置为持久化,宕机重启后,将自动加载宕机时刻的数据到缓存系统中,具有更好的灾备机制。
4、Memcache可以使用Magent在客户端进行一致性hash做分布式。Redis支持在服务器端做分布式(PS:Twemproxy/Codis/Redis-cluster多种分布式实现方式)。
5、Memcached的简单限制就是键key和value的限制。最大键长为250个字符。可以接受的储存数据不能超过1MB(可修改配置文件变大),因为这是典型slab的最大值,不适合虚拟机使用。而Redis的key长度支持到512k。
6、Redis使用的是单线程模型,保证了数据按顺序提交。Memcache需要使用CAS保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作cpu利用。由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis 。
7、Memcached内存管理:使用Slab Allocation。原理相当简单,预先分配一系列大小固定的组,然后根据数据大小选择最合适的块存储。避免了内存碎片。缺点:不能变长,浪费了一定空间,Memcached默认情况下下一个slab的最大值为前一个的1.25倍。
8、Redis内存管理:Redis通过定义一个数组来记录所有的内存分配情况,Redis采用的是包装的malloc/free,相较于Memcached的内存管理方法来说,要简单很多。由于malloc首先以链表的方式搜索已管理的内存中可用的空间分配,导致内存碎片比较多。