NoSQL
1 SQL
结构化的查询语言。SQL常常会用在咱们的关系型数据库中(mysql/oracle/sql server/db2)。譬如咱们以前使用的DDL/DML/DQL/DCL..
2 为何要学习NOSQL
非结构化的查询语言。NOSQL常常会用在咱们的非关系型的数据中。
谈一谈这个东西 “互联网”。
特色: 多样化、数据量激增、实时变化、……………….
在这样子的一种互联网的背景下,对于咱们的软件来说,它要求咱们软件具备 高并发。多样性,还要可以进行海量的数据处理。这个时候咱们就要思考咱们的项目,具不具有高并发,多样性,还有海量的数据库处理能力? 若是咱们的项目不知足当中的需求,这个时候咱们就要优化或者重构咱们的项目的架构。
咱们就必须了解咱们的互联网的机构:
阿里巴巴第一代产品,他的项目架构LAMP(Linux + Apache + Mybatis +PHP)mysql
2.1 单一的msql数据库
了解下当前咱们项目的架构:
分析一下:
优势: 方便,搭建容易。
缺点: 1.仓库的容器有限。2.数据的总量在不断的增长,那么一台数据库很明显不能知足咱们需求。3.这个数据咱们既能够读,也能够写。这个时候对数据库的读写性能有要求了。
4.当仓库中的数据量比较多状况下,对数据库中的数据进行分类存放。分类存放以后,为了方便别人去快速的读取咱们的数据。这个时候咱们的数据库一般会建立索引(B+TREE),方便查询的速度,问题是,你建立了索引拿你就要开辟空间来保存索引,自己空间就有限。你还要对索引进行维护,也要消耗咱们数据库的性能。
总结:咱们上面的这种架构只能说是“自娱自乐”。知足不了大并发,多样性,海量数据的需求。
2.2 Memcached(缓存) + mysql + 垂直拆分
随着咱们数据量的不断的增长,咱们全部的上面架构的网站,都会开始出现性能降低的问题。
为了改善当前的状态,提高系统的性能。程序员就开始思索,我能不能不把全部的数据都放在数据库中,或者,我能不能把不常常发生改变的数据,第一次从数据库中取出来以后,我就放入到一个文件中。第二次在去访问的时候,咱们就直接从文件中去取数据,这样子一来,数据库的性能就有必定的改善。程序员
可是呢这种架构存在问题。文件不能进行共享redis
咱们就要想办法让文件中的数据进行数据的共享。会使用一个分布式的缓存框架,这个缓存框架就叫作memechached./ehcachesql
我全部的数据都保存到了一个数据库中,因此数据库的存储压力很是的大,这个时候咱们就能够进行垂直拆分,咱们对数据库进行拆分。譬如咱们电子商务网站,按照咱们业务模块分析,能够分红咱们卖家和买家,也能够分红咱们的商品,订单,支付,库存….等等模块。
咱们就把之前全部的信息都保存到一个数据库中,如今我把这个数据库拆分红买家库和买家库,和商品库,订单库,支付库……………
2.3 Mysql的主从复制和读写分离
随着咱们数据量爆炸式的增,譬如咱们双十一的那一天,咱们系统的并发量很是的大,卖家库承受的鸭梨很是大。这个时候为了缓解咱们卖家库的压力,所以咱们能够采用主从复制,读写分离这样子的一种思想。
咱们发现买家库既要读数据也要写数据,所以它的性能会受到必定影响,所以咱们为了解决这样子的一个问题。咱们就新增两个数据库,如今总共有买家库有了三个,一个主库,和二个从库,主库负责写数据,从库负责读数据。这就是,读写分离。。。。
总结一下,为何至少要两个从库。两个从库的目的是若是,有一个从库宕机,另一个从库还能用。若是个人主库也宕机了。这个时候还能写吗?为了系统容灾备份。保证数据的完整性,以及缓存数据的一致性。
为了保持数据的一致性,所以咱们就采用了另外的一种方案。叫作主从复制。。数据库
2.4 分库分表+水平拆分+mysql集群
双十一那一天,数据库很是很是的大,在同一秒中,数据的并发可能会达到几万甚至是十几万此,很明显,若是咱们采用上面这种架构的化,仍是不能知足咱们学习,那么这个时候,咱们又要改善咱们数据库这一块的架构。一个知足不了咱们的需求,咱们搞一群这样子的东西来知足咱们需求,咱们就称之为mysql的集群。缓存
分表指的是,咱们知道表是数据库中用来保存数据的地方。表自生有容量大小,一般状况下,若是表中的数据达到了500万行数据的化,这个表就已经很大了。这个时候咱们在用select 去查询数据库,会要等待很长的时间。因此咱们一般在作设计的时候譬如咱们1亿条用户数据的话。之前咱们把这1亿3条数据都保存到了用户表中,这个时候你要从这里面查询zhangsan这个用户话,时间很是的长。这个时候咱们一般会这样子作:咱们就作三个表,分别是user1,user2,user3 而后user1保存索引为0 到3千万的数据 user1就保存3千万到6千万的数据,user3就保存6千万到咱们1亿的数据,这个时候我要查询时候,你譬如我要查询索引为2千万,这个时候咱们就去user1这个表中去查询数据。也就是说,user1,user2,user3这三个表能够在同一个库中,也可能不在同一个库中。
分析这样子的一个问题:
主库在复制数据到从库的过程,这个时候有人从,从库去读取数据,这个时候会不会形成数据的不一致的问题?
譬如早期的数据采用的myISAM这样子的数据库引擎,而这样子的数据库的引擎,它采用的是表锁的概念。主库在复制数据到表中的时候,它会给这个表上一把锁。别人就读不了了。可是这样子作效率是不高。
后期为了提高数据库本省的效率,后面数据库的引擎变成INNODB引擎,而这个引擎采用的是行锁,行锁一般之锁定一行数据。
结论:能不能避免数据的彻底一致,不能。只能作到相对一致。
2.5 Mysql数据的瓶颈
咱们知道mysql是关系型的数据库,它采用的是sql(结构化的查询语言)来进行数据库的操做。你譬如说建立一个库,建立一张表。你譬如说建立一个库,用来保存学生信息的话,咱们常常会在这个库中,建立一个学生表(students)来保存学生的信息。
可是若是说,遇到下面的场景。譬如咱们要求你保存 视频信息,和大文本信息到数据到数据库。若是说数据库保存了1000部小说,1000部电影。而后咱们在执行select .确定会卡死或者说等待至关长的时间。若是们能有一个保存视频,大文本的数据,问题也解决了。
遇到下面的场景:要你设计一套数据库用来描述大家生物机电院系关系。第一个设计不容器把,即便设计出来,查询也很复杂。我解决这个问题,最好的方法是否是就是画图。若是咱们有保存这种图型的数据问题不就解决了。架构
场景:咱们电商网站中,常常有用户,商品,订单详情,订单。这样子的四张表、
我要描述,某一个用户下了那些订单,每一个订单上面有那些商品。设计到四张表的链表查询。若是并发量很是很是大的时候,10000个用户通是完成上述操做的话,效率很是的低。数据库的性能也很是的低。
若是咱们这样子实现这样子的一种格式或者说,咱们能从数据库中,读取这种格式的数据,咱们问题不就解决了。
{
Username: ‘李科’,
Age: ‘19’,
Sex: ‘男’,
Orders:[
{
orderId: ‘001’,
ordertime: ‘2020-04-20’,
product: [
{
productid: 1
name: ‘篮球’,
price: 30,
num: 1
}
]
}
]
}
总结一下,咱们刚刚所说的几个场景,很明显,关系型的数据库,不能解决上面的问题。
因此为了解决上面的问题,咱们就引入非关系型数据库的学习。因此咱们为了解决上面的问题,咱们就要学习NOSQL数据库。
做业:
http://try.redis.io/ 这是在线的工具
http://www.redis.cn/ 中文网址并发