nosql为什么会出现,nosql诞生的原因
nosql数据库是什么 具有代表性以key-value的形式存储的
什么是NoSQL
十年的西双版纳网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整西双版纳建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“西双版纳网站设计”,“西双版纳网站推广”以来,每个客户项目都认真落实执行。
大家有没有听说过“NoSQL”呢?近年,这个词极受关注。看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会没有必要了呢?”但实际上,它是“Not Only SQL”的缩写。它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。
为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。
为了更好地了解本书所介绍的NoSQL数据库,对关系型数据库的理解是必不可少的。那么,就让我们先来看一看关系型数据库的历史、分类和特征吧。
关系型数据库简史
1969年,埃德加?6?1弗兰克?6?1科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的《IBM Research Report》只是IBM公司的内部刊物,因此论文反响平平。1970年,他再次在刊物《Communication of the ACM》上发表了题为“A Relational Model of Data for Large Shared Data banks”(大型共享数据库的关系模型)的论文,终于引起了大家的关注。
科德所提出的关系数据模型的概念成为了现今关系型数据库的基础。当时的关系型数据库由于硬件性能低劣、处理速度过慢而迟迟没有得到实际应用。但之后随着硬件性能的提升,加之使用简单、性能优越等优点,关系型数据库得到了广泛的应用。
通用性及高性能
虽然本书是讲解NoSQL数据库的,但有一个重要的大前提,请大家一定不要误解。这个大前提就是“关系型数据库的性能绝对不低,它具有非常好的通用性和非常高的性能”。毫无疑问,对于绝大多数的应用来说它都是最有效的解决方案。
突出的优势
关系型数据库作为应用广泛的通用型数据库,它的突出优势主要有以下几点:
保持数据的一致性(事务处理)
由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)
可以进行JOIN等复杂查询
存在很多实际成果和专业技术信息(成熟的技术)
这其中,能够保持数据的一致性是关系型数据库的最大优势。在需要严格保证数据一致性和处理完整性的情况下,用关系型数据库是肯定没有错的。但是有些情况不需要JOIN,对上述关系型数据库的优点也没有什么特别需要,这时似乎也就没有必要拘泥于关系型数据库了。
关系型数据库的不足
不擅长的处理
就像之前提到的那样,关系型数据库的性能非常高。但是它毕竟是一个通用型的数据库,并不能完全适应所有的用途。具体来说它并不擅长以下处理:
大量数据的写入处理
为有数据更新的表做索引或表结构(schema)变更
字段不固定时应用
对简单查询需要快速返回结果的处理
。。。。。。
NoSQL数据库
为了弥补关系型数据库的不足(特别是最近几年),NoSQL数据库出现了。关系型数据库应用广泛,能进行事务处理和JOIN等复杂处理。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。
易于数据的分散
如前所述,关系型数据库并不擅长大量数据的写入处理。原本关系型数据库就是以JOIN为前提的,就是说,各个数据之间存在关联是关系型数据库得名的主要原因。为了进行JOIN处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散。相反,NoSQL数据库原本就不支持JOIN处理,各个数据都是独立设计的,很容易把数据分散到多个服务器上。由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作,处理起来也更加容易。同理,数据的读入操作当然也同样容易。
提升性能和增大规模
下面说一点题外话,如果想要使服务器能够轻松地处理更大量的数据,那么只有两个选择:一是提升性能,二是增大规模。下面我们来整理一下这两者的不同。
首先,提升性能指的就是通过提升现行服务器自身的性能来提高处理能力。这是非常简单的方法,程序方面也不需要进行变更,但需要一些费用。若要购买性能翻倍的服务器,需要花费的资金往往不只是原来的2倍,可能需要多达5到10倍。这种方法虽然简单,但是成本较高。
另一方面,增大规模指的是使用多台廉价的服务器来提高处理能力。它需要对程序进行变更,但由于使用廉价的服务器,可以控制成本。另外,以后只要依葫芦画瓢增加廉价服务器的数量就可以了。
不对大量数据进行处理的话就没有使用的必要吗?
NoSQL数据库基本上来说为了“使大量数据的写入处理更加容易(让增加服务器数量更容易)”而设计的。但如果不是对大量数据进行操作的话,NoSQL数据库的应用就没有意义吗?
答案是否定的。的确,它在处理大量数据方面很有优势。但实际上NoSQL数据库还有各种各样的特点,如果能够恰当地利用这些特点将会是非常有帮助。具体的例子将会在第2章和第3章进行介绍,这些用途将会让你感受到利用NoSQL的好处。
希望顺畅地对数据进行缓存(Cache)处理
希望对数组类型的数据进行高速处理
希望进行全部保存
多样的NoSQL数据库
NoSQL数据库存在着“key-value存储”、“文档型数据库”、“列存储数据库”等各种各样的种类,每种数据库又包含各自的特点。下一节让我们一起来了解一下NoSQL数据库的种类和特点。
NoSQL数据库是什么
NoSQL说起来简单,但实际上到底有多少种呢?我在提笔的时候,到NoSQL的官方网站上确认了一下,竟然已经有122种了。另外官方网站上也介绍了本书没有涉及到的图形数据库和对象数据库等各个类别。不知不觉间,原来已经出现了这么多的NoSQL数据库啊。
本节将为大家介绍具有代表性的NoSQL数据库。
key-value存储
这是最常见的NoSQL数据库,它的数据是以key-value的形式存储的。虽然它的处理速度非常快,但是基本上只能通过key的完全一致查询获取数据。根据数据的保存方式可以分为临时性、永久性和两者兼具三种。
临时性
memcached属于这种类型。所谓临时性就是 “数据有可能丢失”的意思。memcached把所有数据都保存在内存中,这样保存和读取的速度非常快,但是当memcached停止的时候,数据就不存在了。由于数据保存在内存中,所以无法操作超出内存容量的数据(旧数据会丢失)。
在内存中保存数据
可以进行非常快速的保存和读取处理
数据有可能丢失
永久性
Tokyo Tyrant、Flare、ROMA等属于这种类型。和临时性相反,所谓永久性就是“数据不会丢失”的意思。这里的key-value存储不像memcached那样在内存中保存数据,而是把数据保存在硬盘上。与memcached在内存中处理数据比起来,由于必然要发生对硬盘的IO操作,所以性能上还是有差距的。但数据不会丢失是它最大的优势。
在硬盘上保存数据
可以进行非常快速的保存和读取处理(但无法与memcached相比)
数据不会丢失
两者兼具
Redis属于这种类型。Redis有些特殊,临时性和永久性兼具,且集合了临时性key-value存储和永久性key-value存储的优点。Redis首先把数据保存到内存中,在满足特定条件(默认是15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的key发生变更)的时候将数据写入到硬盘中。这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久性。这种类型的数据库特别适合于处理数组类型的数据。
同时在内存和硬盘上保存数据
可以进行非常快速的保存和读取处理
保存在硬盘上的数据不会消失(可以恢复)
适合于处理数组类型的数据
面向文档的数据库
MongoDB、CouchDB属于这种类型。它们属于NoSQL数据库,但与key-value存储相异。
不定义表结构
面向文档的数据库具有以下特征:即使不定义表结构,也可以像定义了表结构一样使用。关系型数据库在变更表结构时比较费事,而且为了保持一致性还需修改程序。然而NoSQL数据库则可省去这些麻烦(通常程序都是正确的),确实是方便快捷。
可以使用复杂的查询条件
跟key-value存储不同的是,面向文档的数据库可以通过复杂的查询条件来获取数据。虽然不具备事务处理和JOIN这些关系型数据库所具有的处理能力,但除此以外的其他处理基本上都能实现。这是非常容易使用的NoSQL数据库。
不需要定义表结构
可以利用复杂的查询条件
面向列的数据库
Cassandra、Hbase、HyperTable属于这种类型。由于近年来数据量出现爆发性增长,这种类型的NoSQL数据库尤其引人注目。
面向行的数据库和面向列的数据库
普通的关系型数据库都是以行为单位来存储数据的,擅长进行以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被称为面向行的数据库。相反,面向列的数据库是以列为单位来存储数据的,擅长以列为单位读入数据。
高扩展性
面向列的数据库具有高扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,利用面向列的数据库的优势,把它作为批处理程序的存储器来对大量数据进行更新也是非常有用的。但由于面向列的数据库跟现行数据库存储的思维方式有很大不同,应用起来十分困难。
高扩展性(特别是写入处理)
应用十分困难
最近,像Twitter和Facebook这样需要对大量数据进行更新和查询的网络服务不断增加,面向列的数据库的优势对其中一些服务是非常有用的,但是由于这与本书所要介绍的内容关系不大,就不进行详细介绍了。
总结:
NoSQL并不是No-SQL,而是指Not Only SQL。
NoSQL的出现是为了弥补SQL数据库因为事务等机制带来的对海量数据、高并发请求的处理的性能上的欠缺。
NoSQL不是为了替代SQL而出现的,它是一种替补方案,而不是解决方案的首选。
绝大多数的NoSQL产品都是基于大内存和高性能随机读写的(比如具有更高性能的固态硬盘阵列),一般的小型企业在选择NoSQL时一定要慎重!不要为了NoSQL而NoSQL,可能会导致花了冤枉钱又耽搁了项目进程。
NoSQL不是万能的,但在大型项目中,你往往需要它!
为什么要使用NoSQL?NOSQL的优势
这次的NoSQL专栏系列将先整体介绍NoSQL,然后介绍如何把NoSQL运用到自己的项目中合适的场景中,还会适当地分析一些成功案例,希望有成功使用NoSQL经验的朋友给我提供一些线索和信息。
NoSQL概念随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)
NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。
传统关系数据库的瓶颈
传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。
到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。
Memcached+MySQL
后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。
Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。当时,如果你去面试,你说你有Memcached经验,肯定会加分的。
Mysql主从读写分离
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
分表分库随着web2.0的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。
MySQL的扩展性瓶颈
在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。
MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。
关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
NOSQL的优势易扩展NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。
高可用NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。
总结NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。
MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。
互联网背景下为什么会出现NoSQL
NoSQL泛指非关系型数据库。随着互联网行业的兴起与发展,传统的数据库结构已经很难适应大规模数据、非结构性数据带来的挑战,也就是现在大数据行业的发展对传统的数据库发出了挑战,而为了应对大规模的非结构性数据的处理,非关系型数据库才会在计算机、软件、数据库等方面得到飞速的发展。
什么是NoSQL数据库?
NoSQL,指的是非关系型的数据库。
NoSQL 是Not Only SQL 的缩写,意思是“不仅仅是 SQL”,而不是“不使用 SQL”。
NoSQL 的出现可以解决传统关系型数据库所不能解决的问题。
衡量数据库性能的重要指标
具体来说,本文包括以下内容:
事务
查询性能
用户和查询冲突
容量
配置
NoSQL 数据库
事务
事务可以观察真实用户的行为:能够在应用交互时捕获实时性能。众所周知,测量事务的性能包括获取整个事务的响应时间和组成事务的各个部分的响应时间。通常我们可以用这些响应时间与满足事务需求的基线对比,来确定当前事务是否处于正常状态。
如果你只想衡量应用的某个方面,那么可以评估事务的行为。所以,尽管容器指标能够提供更丰富的信息,并且帮助你决定何时对当前环境进行自动测量,但你的事务就足以确定应用性能。无需向应用程序服务器获取 CPU 的使用情况,你更应该关心用户是否完成了事务,以及该事务是否得到了优化。
补充一个小知识点,事务是由入口点决定的,通过该入口点可以启动事务与应用进行交互。
一旦定义了事务,会在整个应用生态系统中对其性能进行测量,并将每个事务与基线进行比对。例如,我们可能会决定当事务的响应时间与基线相比,一旦慢于平均响应时间的两个标准差是否就应该判定为异常,如图1所示。
图1-基于基线评估当前事务响应时间
用于评估事务的基线与正在进行的事务活动在时间上是一致的,但事务会由每个事务执行来完善。例如,当你选定一个基线,在当前事务结束之后,将事务与平均响应时间按每天的小时数和每周的天数进行对比,所有在那段时间内执行的事务都将会被纳入下周的基线中。通过这种机制,应用程序可以随时间而变化,而无需每次都重建原始基线;你可以将其看作是一个随时间移动的窗口。
总之,事务最能反映用户体验的测量方法,所以也是衡量性能状况最重要的指标。
查询性能
最容易检测到查询性能是否正常的指标就是查询本身。由查询引起的问题可能会导致时间太长而无法识别所需数据或返回数据。所以不妨在查询中排查以下问题。
1. 选择过多冗余数据
编写查询语句来返回适当的数据是远远不够的,很可能你的查询语句会返回太多列,从而导致选择行和检索数据变得异常缓慢。所以,最好是列出所需的列,而不是直接用 SELECT*。当需要在特定字段中查询时,该计划可能会确定一个覆盖索引从而加快结果返回。覆盖索引通常会包含查询中使用的所有字段。这意味着数据库可以仅从索引中产生结果,而不需要通过底层表来构建。
另外,列出结果中所需的列不仅可以减少传输的数据,还能进一步提高性能。
2. 表之间的低效联接
联接会导致数据库将多组数据带到内存中进行比较,这会产生多个数据库读取和大量 CPU。根据表的索引,联接还可能需要扫描两个表的所有行。如果写不好两个大型表之间的联接,就需要对每个表进行完整扫描,这样的计算量将会非常大。其他会拖慢联接的因素包括联接列之间存在不同的数据类型、需要转换或加入包含 LIKE 的条件,这样就会阻止使用索引。另外,还需注意避免使用全外联接;在恰当的时候使用内部联接只返回所需数据。
3. 索引过多或过少
如果查询优化没有可用的索引时,数据库会重新扫描表来产生查询结果,这个过程会生成大量的磁盘输入/输出(I/O)。适当的索引可以减少排序结果的需要。虽然非唯一值的索引在生成结果时,不能像唯一索引那样方便。如果键越大,索引也会变大,并通过它们创建更多的磁盘 I/O。大多数索引是为了提高数据检索的性能,但也需要明白索引本身也会影响数据的插入和更新,因为所有相关联的指标都必须更新。
4. 太多的SQL导致争用解析资源
任何 SQL 查询在执行之前都必须被解析,在生成执行计划之前需要对语法和权限进行检查。由于解析非常耗时,数据库会保存已解析的 SQL 来重复利用,从而减少解析的耗时。因为 WHERE 语句不同,所以使用文本值的查询语句不能被共享。这将导致每个查询都会被解析并添加到共享池中,由于池的空间有限,一些已保存的查询会被舍弃。当这些查询再次出现时,则需要重新解析。
用户和查询冲突
数据库支持多用户,但多用户活动也可能造成冲突。
1. 由慢查询导致的页/行锁定
为了确保查询产生精确的结果,数据库必须锁定表以防止在运行读取查询时再发生其他的插入和更新行为。如果报告或查询相当缓慢,需要修改值的用户可能需要等待至更新完成。锁提示能帮助数据库使用最小破坏性的锁。从事务数据库中分离报表也是一种可靠的解决方法。
2. 事务锁和死锁
当两个事务被阻塞时会出现死锁,因为每一个都需要使用被另一个占用的资源。当出现一个普通锁时,事务会被阻塞直到资源被释放。但却没有解决死锁的方案。数据库会监控死锁并选择终止其中一个事务,释放资源并允许该事务继续进行,而另一个事务则回滚。
3. 批处理操作造成资源争夺
批处理过程通常会执行批量操作,如大量的数据加载或生成复杂的分析报告。这些操作是资源密集型的,但可能影响在线用户的访问应用的性能。针对此问题最好的解决办法是确保批处理在系统使用率较低时运行,比如晚上,或用单独的数据库进行事务处理和分析报告。
容量
并不是所有的数据库性能问题都是数据库问题。有些问题也是硬件不合适造成的。
1. CPU 不足或 CPU 速度太慢
更多 CPU 可以分担服务器负载,进一步提高性能。数据库的性能不仅是数据库的原因,还受到服务器上运行其他进程的影响。因此,对数据库负载及使用进行审查也是必不可少的。由于 CPU 的利用率时时在变,在低使用率、平均使用率和峰值使用率的时间段分别检查该指标可以更好地评估增加额外的 CPU 资源是否有益。
2. IOPS 不足的慢磁盘
磁盘性能通常以每秒输入/输出操作(IOPS)来计。结合 I/O 大小,该指标可以衡量每秒的磁盘吞吐量是多少兆。同时,吞吐量也受磁盘的延迟影响,比如需要多久才能完成请求,这些指标主要是针对磁盘存储技术而言。传统的硬盘驱动器(HDD)有一个旋转磁盘,通常比固态硬盘(SSD)或闪存更慢。直到近期,SSD 虽然仍比 HDD 贵,但成本已经降了下来,所以在市场上也更具竞争力。
3. 全部或错误配置的磁盘
众所周知,数据库会被大量磁盘访问,所以不正确配置的磁盘可能带来严重的性能缺陷。磁盘应该适当分区,将系统数据目录和用户数据日志分开。高度活跃的表应该区分以避免争用,通过在不同磁盘上存放数据库和索引增加并行放置,但不要将操作系统和数据库交换空间放置在同一磁盘上。
4. 内存不足
有限或不恰当的物理内存分配会影响数据库性能。通常我们认为可用的内存更多,性能就越好。监控分页和交换,在多个非繁忙磁盘中建立多页面空间,进一步确保分页空间分配足够满足数据库要求;每个数据库供应商也可以在这个问题上提供指导。
5. 网速慢
网络速度会影响到如何快速检索数据并返回给终端用户或调用过程。使用宽带连接到远程数据库。在某些情况下,选择 TCP/IP 协议而不是命名管道可显著提高数据库性能。
配置
每个数据库都需设置大量的配置项。通常情况下,默认值可能不足以满足数据库所需的性能。所以,检查所有的参数设置,包括以下问题。
1. 缓冲区缓存太小
通过将数据存储在内核内存,缓冲区缓存可以进一步提高性能同时减少磁盘 I/O。当缓存太小时,缓存中的数据会更频繁地刷新。如果它再次被请求,就必须从磁盘重读。除了磁盘读取缓慢之外,还给 I/O 设备增添了负担从而成为瓶颈。除了给缓冲区缓存分配足够的空间,调优 SQL 查询可以帮助其更有效地利用缓冲区缓存。
2. 没有查询缓存
查询缓存会存储数据库查询和结果集。当执行相同的查询时,数据会在缓存中被迅速检索,而不需要再次执行查询。数据会更新失效结果,所以查询缓存是唯一有效的静态数据。但在某些情况下,查询缓存却可能成为性能瓶颈。比如当锁定为更新时,巨大的缓存可能导致争用冲突。
3. 磁盘上临时表创建导致的 I/O 争用
在执行特定的查询操作时,数据库需要创建临时表,如执行一个 GROUP BY 子句。如果可能,在内存中创建临时表。但是,在某些情况下,在内存中创建临时表并不可行,比如当数据包含 BLOB 或 TEXT 对象时。在这些情况下,会在磁盘上创建临时表。大量的磁盘 I / O 都需要创建临时表、填充记录、从表中选择所需数据并在查询完成后舍弃。为了避免影响性能,临时数据库应该从主数据库中分离出来。重写查询还可以通过创建派生表来减少对临时表的需求。使用派生表直接从另一个 SELECT 语句的结果中选择,允许将数据加到内存中而不是当前磁盘上。
NoSQL 数据库
NoSQL 的优势在于它处理大数据的能力非常迅速。但是在实际使用中,也应该综合参考 NoSQL 的缺点,从而决定是否适合你的用例场景。这就是为什么NoSQL通常被理解为 「不仅仅是 SQL」,说明了 NoSQL 并不总是正确的解决方案,也没必要完全取代 SQL,以下分别列举出五大主要原因。
1. 挑剔事务
难以保持 NoSQL 条目的一致性。当访问结构化数据时,它并不能完全确保同一时间对不同表的更改都生效。如果某个过程发生崩溃,表可能会不一致。一致事务的典型代表是复式记账法。相应的信贷必须平衡每个借方,反之亦然。如果双方数据不一致则不能输入。NoSQL 则可能无法保证「收支平衡」。
2. 复杂数据库
NoSQL 的支持者往往以高效代码、简单性和 NoSQL 的速度为傲。当数据库任务很简单时,所有这些因素都是优势。但当数据库变得复杂,NoSQL 会开始分解。此时,SQL 则比 NoSQL 更好地处理复杂需求,因为 SQL 已经成熟,有符合行业标准的接口。而每个 NoSQL 设置都有一个唯一的接口。
3. 一致联接
当执行 SQL 的联接时,由于系统必须从不同的表中提取数据进行键对齐,所以有一个巨大的开销。而 NoSQL 似乎是一个空想,因为缺乏联接功能。所有的数据都在同一个表的一个地方。当检索数据时,它会同时提取所有的键值对。问题在于这会创建同一数据的多个副本。这些副本也必须更新,而这种情况下,NoSQL 没有功能来确保更新。
4. Schema设计的灵活性
由于 NoSQL 不需要 schema,所以在某些情况下也是独一无二的。在以前的数据库模型中,程序员必须考虑所有需要的列能够扩展,能够适应每行的数据条目。在 NoSQL 下,条目可以有多种字符串或者完全没有。这种灵活性允许程序员迅速增加数据。但是,也可能存在问题,比如当有多个团体在同一项目上工作时,或者新的开发团队接手一个项目时。开发人员能够自由地修改数据库,也可能会不断实现各种各样的密钥对。
5. 资源密集型
NoSQL 数据库通常比关系数据库更加资源密集。他们需要更多的 CPU 储备和 RAM 分配。出于这个原因,大多数共享主机公司都不提供 NoSQL。你必须注册一个 VPS 或运行自己的专用服务器。另一方面,SQL 主要是在服务器上运行。初期的工作都很顺利,但随着数据库需求的增加,硬件必须扩大。单个大型服务器比多个小型服务器昂贵得多,价格呈指数增长。所以在这种企业计算场景下,使用 NoSQL 更为划算,例如那些由谷歌和 Facebook 使用的服务器。
名称栏目:nosql为什么会出现,nosql诞生的原因
本文网址:http://pwwzsj.com/article/hciogh.html