精华内容
下载资源
问答
  • Java job interview:熟悉Mysql, Oracle等关系型数据库的使用和设计
    2021-09-18 19:59:39

    精通主流开发框架:Spring、Spring MVC、struts2、Hibernate、MyBatis等;
    熟悉UML语言、XML、HTML、Freemarker、JavaScript、CSS等相关技术和知识;
    熟悉Mysql, Oracle等关系型数据库的使用和设计
    熟练使用PowerDesigner、Rational Rose等建模工具,有实际项目的数据库建模经验;
    熟悉memcached、redis等常见缓存存储机制;
    熟悉代理服务器Nginx、Apache等,对Tomcat、JBOSS等服务器产品了解并能进行性能调优;
    熟悉分布式系统的设计和应用,熟悉spring-cloud,dubbo等服务化框架,有中大型分布式系统开发;
    能承受一定的工作压力,思路清晰,能独立分析解决问题,具有高度责任心和良好的团队合作精神(有往技术管理岗发展意向)。
    熟练掌握J2EE,Java WEB编程技术,对各种开源的框架如Spring Boot、Spring Cloud,MyBatis等有深入的应用和优化
    熟练掌握数据库MySql的使用,设计,SQL调优等;
    有线上高并发、大数据量处理经验,对java多线程编程有较深的理解
    熟悉Redis/Memcache、Kafka、Zookeeper、Netty、MQTT、ElasticSearch、RocketMQ等常用中间件;
    熟悉Linux的常用命令及脚本编写;
    对SOA、服务化、模块化有较好的实际应用经验;
    优秀的分析问题,解决问题能力,乐于解决具有挑战性的问题。
    熟悉Mysql等数据库结构设计,JAVA操作数据库,数据库性能调优;
    熟悉RPC JSON接口技术、WEB SOCKET开发,熟悉K线开发;
    熟悉分布式、缓存、消息等机制,熟悉大数据量、高并发、高性能的分布式系统的设计及应用、调优;
    熟悉Linux操作系统、SVN操作;
    具有良好的Java开发基础,熟悉面向对象设计原则,常用设计模式及应用场景;
    精通SpringMVC/MyBatis/shiro等开源框架,对源码有一定研究;
    熟练使用maven/git/jenkins等管理工具;
    熟悉常用互联网技术,如nginx/zookeeper/dubbo/diamond/redis/mq/shiro等,具备一定调优能力;
    有APP接口开发、第三方数据接口对接开发经验;
    能独立编写系统规划设计文档;
    具备独立搭建有一定伸缩性的架构能力,能按时完成上级交给的开发任务;
    熟练掌握Linux下的常用命令,熟练使用命令查看应用系统日志;
    对高并发/高可用/高可靠/高性能/大数据处理有过实际项目及产品经验者优先考虑;
    有大数据产品/云产品/中间件技术解决方案者优先考虑。
    熟悉分布式系统,对分布式系统常见问题能提出有效可行的解决方案;
    善于思考/主动积极/沟通能力强,有良好的团队精神,能够承担压力。
    喜欢研究新技术,有springBoot/docker/NodeJs/Akka/Scala/Hadoop经验者有优先。
    负责游戏服务器后端逻辑开发工作,协助解决项目开发过程中的技术难题;
    精通socket编程,多线程编程等游戏后端通讯开发,具有丰富的实时交互游戏方案解决经验;
    熟悉redis,mongodb等NoSQL数据库,mysql数据库,精通数据结构与算法;
    具有比较强的分析问题和解决问题的能力; 对技术有钻研精神,积极主动,乐于分享;
    具备大型游戏服务器程序或棋牌类游戏开发经验者优先。
    负责性能、网络、数据等方面的优化,并开拓新的技术解决方案。
    熟悉redis,mongodb等NoSQL数据库,mysql数据库,精通数据结构与算法;
    掌握常用java设计模式掌握一些常用java框架和中间件,如Spring系列,常用ORM框架,缓存,MQ,zookeeper,dubbo,servlet容器,WEB服务器等等
    掌握OOD思想,几倍扎实的抽象能力,设计能力及测试思维。
    熟练使用Spring,,Springboot,SpringCloud
    熟练使用MySql,MongoDB,Redis和Es存储技术,了解各存储特性,并能在做技术选型和存储选型时说明其特性和优点且有相应的测试数据做支撑
    扎实的java基础以及数据结构和算法基础,熟悉计算机及网络相关知识
    熟悉分布式系统的常见技术,熟练常用RPC如(Dubbo)框架。
    熟悉常用开源开发组件(Redis, RabbitMQ, Kafka, ElasticSearch等)
    熟悉MySQL性能调优#优先考虑#电商,金融app后台开发工作经验有高并发,分布式开发经验自我驱动力强,热爱coding
    编程基础扎实,对数据结构知识有深入的理解,能熟练掌握应用到开发。

    更多相关内容
  • 初识MySQLMySQL组成分为两类数据库分为两类连接MySQL服务器:SQL命令分类如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个...

    MySQL组成分为两类

    1.客户端 --> 控制台命令工具(Mysql自带的连接工具,Windows自带的命令行)
    2.服务器端 --> 服务
    a.数据库 database(项目)
    b.表 table (一个数据库对应多张表)(相当于Java里的类)
    c.字段 (相当于Java中类的属性)
    d.数据

    数据库分为两类

    1.关系型数据库:MySQL,Oracle[很贵,超量数据],SQLSever,DB2
    2.非关系型数据库:Redis,Memcached(内存性k-v数据库),MongoDB(文档性数据库)

    连接MySQL服务器:

    mysql -h 127.0.0.1 -P 3306 -u root -p
    

    在这里插入图片描述

    展开全文
  • NoSQL并不是关系型数据库管理系统,本文将会介绍NoSQL数据库与关系型数据库之间的差别,同时还会讨论在何种场景下应该使用NoSQL,何种场景下不应该使用。由于NoSQL还是个相对较新的技术,因此它还面临着很多挑战。 ...

    云计算背后的秘密:NoSQL诞生的原因和优缺点

    我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL有了非常深入的研究,但是在最近准备YunTable的Chart的时候,发现NoSQL不仅非常博大精深,而且我个人对NoSQL的理解也只是皮毛而已,但我还算是一个“知耻而后勇”的人,所以经过一段时间的学习之后,从本系列第六篇开始,就将和大家聊聊NoSQL,而本篇将主要给大家做一下NoSQL数据库的综述。 
    首先将和大家聊聊为什么NoSQL会在关系型数据库已经非常普及的情况下异军突起?

    诞生的原因

    随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 
    1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度; 
    2. 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量; 
    3. 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理;

    1. 庞大运营成本的考量:IT经理们希望在硬件成本、软件成本和人力成本能够有大幅度地降低;

    目前世界上主流的存储系统大部分还是采用了关系型数据库,其主要有一下优点:

    1.事务处理—保持数据的一致性;

    2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上只有一处);

    3.可以进行Join等复杂查询。

    虽然关系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足上面这几个需求: 
    1. 扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难; 
    2. 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重; 
    3. 成本高:企业级数据库的License价格很惊人,并且随着系统的规模,而不断上升; 
    4. 有限的支撑容量:现有关系型解决方案还无法支撑Google这样海量的数据存储; 
    业界为了解决上面提到的几个需求,推出了多款新类型的数据库,并且由于它们在设计上和传统的NoSQL数据库相比有很大的不同,所以被统称为“NoSQL”系列数据库。总的来说,在设计上,它们非常关注对数据高并发地读写和对海量数据的存储等,与关系型数据库相比,它们在架构和数据模型方量面做了“减法”,而在扩展和并发等方面做了“加法”。现在主流的NoSQL数据库有BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB和Redis等。接下来,将关注NoSQL数据库到底存在哪些优缺点。

    优缺点

    在优势方面,主要体现在下面这三点: 
    1. 简单的扩展:典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群; 
    2. 快速的读写:主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作; 
    3. 低廉的成本:这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本; 
    4. 
    但瑕不掩瑜,NoSQL数据库还存在着很多的不足,常见主要有下面这几个: 
    1. 不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本; 
    2. 支持的特性不够丰富:现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等; 
    3. 现有产品的不够成熟:大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语; 
    上面NoSQL产品的优缺点都是些比较共通的,在实际情况下,每个产品都会根据自己所遵从的数据模型和CAP理念而有所不同,接下来,将给大家介绍NoSQL两个最重要的概念:数据模型和CAP理念,并在本文最后,对主流的NoSQL数据库进行分类。

    Naresh Kumar是位软件工程师与热情的博主,对于编程与新事物拥有极大的兴趣,非常乐于与其他开发者和程序员分享技术上的研究成果。近日,Naresh撰文比较了NoSQL与RDBMS,并详细介绍了他们各自的特点与适用的场景。

    NoSQL并不是关系型数据库管理系统,本文将会介绍NoSQL数据库与关系型数据库之间的差别,同时还会讨论在何种场景下应该使用NoSQL,何种场景下不应该使用。由于NoSQL还是个相对较新的技术,因此它还面临着很多挑战。

    时至今日,互联网上有数以亿计的用户。大数据与云计算已经成为很多主要的互联网应用都在使用或是准备使用的技术,这是因为互联网用户每天都在不断增长,数据也变得越来越复杂,而且有很多非结构化的数据存在,这是很难通过传统的关系型数据库管理系统来处理的。NoSQL技术则能比较好地解决这个问题,它主要用于非结构化的大数据与云计算上。从这个角度来看,NoSQL是一种全新的数据库思维方式。

    为何要使用NoSQL数据库?

    1.NoSQL具有灵活的数据模型,可以处理非结构化/半结构化的大数据

    现在,我们可以通过Facebook、D&B等第三方轻松获得与访问数据,如个人用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器生成的数据等。对这些数据的使用正在快速改变着通信、购物、广告、娱乐以及关系管理的特质。没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,能够轻松容纳新的数据类型,并且不会被第三方数据提供商内容结构的变化所累。很多新数据都是非结构化或是半结构化的,因此开发者还需要能够高效存储这种数据的数据库。但遗憾的是,关系型数据库所使用的定义严格、基于模式的方式是无法快速容纳新的数据类型的,对于非结构化或是半结构化的数据更是无能为力。NoSQL提供的数据模型则能很好地满足这种需求。很多应用都会从这种非结构化数据模型中获益,比如说CRM、ERP、BPM等等,他们可以通过这种灵活性存储数据而无需修改表或是创建更多的列。这些数据库也非常适合于创建原型或是快速应用,因为这种灵活性使得新特性的开发变得非常容易。

    2.NoSQL很容易实现可伸缩性(向上扩展与水平扩展)

    如果有很多用户在频繁且并发地使用你的应用,那么你就需要考虑可伸缩的数据库技术而非传统的RDBMS了。对于关系型技术来说,很多应用开发者会发现动态的可伸缩性是难以实现的,这时就应该考虑切换到NoSQL数据库上。对于云应用来说,关系型数据库一开始是普遍的选择。然而,在使用过程中却遇到了越来越多的问题,原因就在于他们是中心化的,向上扩展而非水平扩展的。这使得他们不适合于那些需要简单且动态可伸缩性的应用。NoSQL数据库从一开始就是分布式、水平扩展的,因此非常适合于互联网应用分布式的特性。

    在三层互联网架构的Web/应用层上,多年来向上扩展已经成为默认的扩展方式了。随着应用使用人数的激增,我们需要添加更多的服务器,性能则是通过负载均衡来实现的,这时的代价与用户数量成线性比例关系。在NoSQL数据库之前,数据库层的默认扩展方式就是向上扩展。为了支持更多的并发用户以及存储更多的数据,你需要越来越好的服务器,更好的CPU、更多的内存、更大的磁盘来维护所有表。然而,好的服务器意味着更加复杂、私有、并且也更加昂贵。这与Web/应用层所使用的便宜的硬件形成了鲜明的对比。

    3.动态模式

    关系型数据库需要在添加数据前先定义好模式。比如说,你需要存储客户的电话号码、姓名、地址、城市与州等信息,SQL数据库需要提前知晓你要存的是什么。这对于敏捷开发模式来说是场灾难,因为每次完成新特性时,数据库的模式通常都需要改变。因此,如果在开发过程中想将客户喜欢的条目加到数据库中,那就得向表中添加这一列才行,然后要做的就是将整个数据库迁移到新的模式上。

    4.自动分片

    由于是结构化的,关系型数据库通常会垂直扩展,单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价就是非常昂贵、扩展受到限制,并且数据库基础设施会成为失败点。这个问题的解决方案就是水平扩展,添加服务器而不是为单台服务器增加更多的能力。NoSQL数据库通常都支持自动分片,这意味着他们本质上就会自动在多台服务器上分发数据,应用甚至都不知道这些事情。数据与查询负载会自动在多台服务器上做到平衡,当某台服务器当机时,它能快速且透明地被替换掉。

    5.复制

    大多数NoSQL数据库也支持自动复制,这意味着你可以获得高可用性与灾备恢复功能。从开发者的角度来看,存储环境本质上是虚拟化的。

    NoSQL数据库面临的挑战

    1.成熟度

    RDBMS系统由来已久。NoSQL拥护者们会说RDBMS的高龄是其衰退的标志,不过对于大多数CIO来说,RDBMS的成熟让人放心。对于大多数情况来说,RDBMS系统是稳定且功能丰富的。相比较而言,大多数NoSQL数据库则还有很多特性有待实现。

    2.支持

    企业需要的是安心,如果关键系统出现了故障,他们可以获得即时的支持。所有RDBMS厂商都在不遗余力地提供良好的企业支持。与之相反,大多数NoSQL系统都是开源项目,虽然每种数据库都有那么几家公司提供支持,不过这些公司大多都是小的初创公司,没有全球支持资源,也没有Oracle、微软或是IBM那种令人放心的公信力。

    3.分析与商业智能

    NoSQL数据库在Web 2.0应用时代开始出现。因此,大多数特性都是面向这些应用的需要的。然而,应用中的数据对于业务来说是有价值的,这种价值远远超出了Web应用那种CRUD。企业数据库中的业务信息可以帮助改进效率并提升竞争力,商业智能对于大中型企业来说是个非常关键的IT问题。

    4.管理

    NoSQL的设计目标是提供零管理的解决方案,不过当今的现实却离这个目标还相去甚远。现在的NoSQL需要很多技巧才能用好,并且需要不少人力、物力来维护。

    5.专业

    全球有很多开发者,每个业务部门都会有熟悉RDBMS概念与编程的人。相反,几乎每个NoSQL开发者都处于学习模式。这种状况会随着时间的流逝而发生改观。但现在,找到一个有经验的RDBMS程序员或是管理员要比NoSQL专家容易多了。

    结论

    NoSQL数据库正在成为数据库领域的重要力量。如果使用恰当,那么它会带来很多好处。然而,企业应该非常小心并注意到这些数据库的限制与问题。

    NoSQL这两年越来越热,尤其是大型互联网公司非常热衷这门技术。根据笔者的经验,并不是任何场景,NoSQL都要优于关系型数据库。下面我们来具体聊聊,什么时候使用NoSQL比较给力:

    1) 数据库表schema经常变化 
    比如在线商城,维护产品的属性经常要增加字段,这就意味着ORMapping层的代码和配置要改,如果该表的数据量过百万,新增字段会带来额外开销(重建索引等)。NoSQL应用在这种场景,可以极大提升DB的可伸缩性,开发人员可以将更多的精力放在业务层。

    2)数据库表字段是复杂数据类型

    对于复杂数据类型,比如SQL Sever提供了可扩展性的支持,像xml类型的字段。很多用过的同学应该知道,该字段不管是查询还是更改,效率非常一般。主要原因是是DB层对xml字段很难建高效索引,应用层又要做从字符流到dom的解析转换。NoSQL以json方式存储,提供了原生态的支持,在效率方便远远高于传统关系型数据库。

    3)高并发数据库请求

    此类应用常见于web2.0的网站,很多应用对于数据一致性要求很低,而关系型数据库的事务以及大表join反而成了”性能杀手”。在高并发情况下,sql与no-sql的性能对比由于环境和角度不同一直是存在争议的,并不是说在任何场景,no-sql总是会比sql快。有篇article和大家分享下,http://artur.ejsmont.org/blog/content/insert-performance-comparison-of-nosql-vs-sql-servers

    4)海量数据的分布式存储

    海量数据的存储如果选用大型商用数据,如Oracle,那么整个解决方案的成本是非常高的,要花很多钱在软硬件上。NoSQL分布式存储,可以部署在廉价的硬件上,是一个性价比非常高的解决方案。Mongo的auto-sharding已经运用到了生产环境。http://www.mongodb.org/display/DOCS/Sharding

    并不是说NoSQL可以解决一切问题,像ERP系统、BI系统,在大部分情况还是推荐使用传统关系型数据库。主要的原因是此类系统的业务模型复杂,使用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引入到项目中。

    在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库。在高速发展的WEB2.0时代,我们发现关系数据库在性能、扩展性、数据的快速备份和恢复、满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用。几年前的一篇文章《One Size Fits All - An Idea Whose Time Has Come and Gone》就已经阐述了这个观点。

    当我们在讨论是否要使用NoSQL的时候,你还需要理解NoSQL也是分很多种类的,在NoSQL百花齐放的今天,NoSQL的正确选择比选择关系数据库还具有挑战性。虽然NoSQL的使用很简单,但是选择却是个麻烦事,这也正是很多人在观望的一个原因。

    NoSQL的分类

    NoSQL仅仅是一个概念,NoSQL数据库根据数据的存储模型和特点分为很多种类。 
    这里写图片描述

    以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如Tokyo Cabinet / Tyrant的Table类型存储,就可以理解为是文档型存储,Berkeley DB XML数据库是基于Berkeley DB之上开发的。

    NoSQL还是关系数据库 
    虽然09年出现了比较激进的文章《关系数据库已死》,但是我们心里都清楚,关系数据库其实还活得好好的,你还不能不用关系数据库。但是也说明了一个事实,关系数据库在处理WEB2.0数据的时候,的确已经出现了瓶颈。

    那么我们到底是用NoSQL还是关系数据库呢?我想我们没有必要来进行一个绝对的回答。我们需要根据我们的应用场景来决定我们到底用什么。

    如果关系数据库在你的应用场景中,完全能够很好的工作,而你又是非常善于使用和维护关系数据库的,那么我觉得你完全没有必要迁移到NoSQL上面,除非你是个喜欢折腾的人。如果你是在金融,电信等以数据为王的关键领域,目前使用的是Oracle数据库来提供高可靠性的,除非遇到特别大的瓶颈,不然也别贸然尝试NoSQL。

    然而,在WEB2.0的网站中,关系数据库大部分都出现了瓶颈。在磁盘IO、数据库可扩展上都花费了开发人员相当多的精力来优化,比如做分表分库(database sharding)、主从复制、异构复制等等,然而,这些工作需要的技术能力越来越高,也越来越具有挑战性。如果你正在经历这些场合,那么我觉得你应该尝试一下NoSQL了。

    选择合适的NoSQL 
    如此多类型的NoSQL,而每种类型的NoSQL又有很多,到底选择什么类型的NoSQL来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:

    1.数据结构特点。包括结构化、半结构化、字段是否可能变更、是否有大文本字段、数据字段是否可能变化。

    2.写入特点。包括insert比例、update比例、是否经常更新数据的某一个小字段、原子更新需求。

    3.查询特点。包括查询的条件、查询热点的范围。比如用户信息的查询,可能就是随机的,而新闻的查询就是按照时间,越新的越频繁。

    NoSQL和关系数据库结合 
    其实NoSQL数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足,所以选择NoSQL的原因并不在功能上。

    所以,我们一般会把NoSQL和关系数据库进行结合使用,各取所长,需要使用关系特性的时候我们使用关系数据库,需要使用NoSQL特性的时候我们使用NoSQL数据库,各得其所。

    举个简单的例子吧,比如用户评论的存储,评论大概有主键id、评论的对象aid、评论内容content、用户uid等字段。我们能确定的是评论内容content肯定不会在数据库中用where content=’’查询,评论内容也是一个大文本字段。那么我们可以把 主键id、评论对象aid、用户id存储在数据库,评论内容存储在NoSQL,这样数据库就节省了存储content占用的磁盘空间,从而节省大量IO,对content也更容易做Cache。

    //从MySQL中查询出评论主键id列表 commentIds=DB.query(“SELECT id FROM comments where aid=’评论对象id’ LIMIT 0,20”); //根据主键id列表,从NoSQL取回评论实体数据 CommentsList=NoSQL.get(commentIds);NoSQL代替MySQL 
    在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等,用NoSQL完全可以替代MySQL存储。不但具有更高的性能,而且开发也更加方便。

    NoSQL作为缓存服务器 
    MySQL+Memcached的架构中,我们处处都要精心设计我们的缓存,包括过期时间的设计、缓存的实时性设计、缓存内存大小评估、缓存命中率等等。

    NoSQL数据库一般都具有非常高的性能,在大多数场景下面,你不必再考虑在代码层为NoSQL构建一层Memcached缓存。NoSQL数据本身在Cache上已经做了相当多的优化工作。

    Memcached这类内存缓存服务器缓存的数据大小受限于内存大小,如果用NoSQL来代替Memcached来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘IO读写,可能比Memcached慢一点,但是完全可以用来缓存数据库的查询操作。

    规避风险 
    由于NoSQL是一个比较新的东西,特别是我们选择的NoSQL数据库还不是非常成熟的产品,所以我们可能会遇到未知的风险。为了得到NoSQL的好处,又要考虑规避风险,鱼与熊掌如何兼得?

    现在业内很多公司的做法就是数据的备份。在往NoSQL里面存储数据的时候还会往MySQL里面存储一份。NoSQL数据库本身也需要进行备份(冷备和热备)。或者可以考虑使用两种NoSQL数据库,出现问题后可以进行切换(避免出现digg使用Cassandra的悲剧)。

    总结 
    本文只是简单的从MySQL和NoSQL的角度分析如何选择,以及进行融合使用。其实在选择NoSQL的时候,你可能还会碰到关于CAP原则,最终一致性,BASE思想的考虑。因为使用MySQL架构的时候,你也会碰到上面的问题,所以这里没有阐述。

    展开全文
  • 作为互联网从业人员,我们要知道关系型数据库MySql、Oracle)无法满足我们对存储的所有要求,因此对底层存储的选型,对每种存储引擎的理解非常重要。同时也由于过去一段时间的工作经历,对这块有了一些更多的思考...

    前言

    你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷。
    作为互联网从业人员,我们要知道关系型数据库(MySql、Oracle)无法满足我们对存储的所有要求,因此对底层存储的选型,对每种存储引擎的理解非常重要。同时也由于过去一段时间的工作经历,对这块有了一些更多的思考,想通过自己的总结把这块写出来分享给大家。

    结构化数据、非结构化数据与半结构化数据

    文章的开始,聊一下结构化数据、非结构化数据与半结构化数据,因为数据特点的不同,将在技术上直接影响存储引擎的选型。

    首先是结构化数据,根据定义结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。例如:
    在这里插入图片描述
    因此关系型数据库完美契合结构化数据的特点,关系型数据库也是关系型数据最主要的存储与管理引擎。

    非结构化数据,指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如办公文档(Word)、文本、图片、HTML、各类报表、视频音频等。

    介于结构化与非结构化数据之间的数据就是半结构化数据了,它是结构化数据的一种形式,虽然不符合二维逻辑这种数据模型结构,但是包含相关标记,用来分割语义元素以及对记录和字段进行分层。常见的半结构化数据有XML和JSON,例如:

    <person>
        <name>张三</name>
        <age>18</age>
        <phone>12345</phone>
    </person>
    

    这种结构也被成为自描述的结构。

    以关系型数据库的方式做存储的架构演进

    首先,我们看一下使用关系型数据库的方式,企业一个系统发展的几个阶段的架构演进(由于本文写的是Sql与NoSql,因此只以存储方式作为切入点,不会涉及类似MQ、ZK这些中间件内容):
    在这里插入图片描述

    阶段一:企业刚发展的阶段,最简单,一个应用服务器配一个关系型数据库,每次读写数据库。

    阶段二:无论是使用MySQL还是Oracle还是别的关系型数据库,数据库通常不会先成为性能瓶颈,通常随着企业规模的扩大,一台应用服务器扛不住上游过来的流量且一台应用服务器会产生单点故障的问题,因此加应用服务器并且在流量入口使用Nginx做一层负载均衡,保证把流量均匀打到应用服务器上。

    阶段三:随着企业规模的继续扩大,此时由于读写都在同一个数据库上,数据库性能出现一定的瓶颈,此时简单地做一层读写分离,每次写主库,读备库,主备库之间通过binlog同步数据,就能很大程度上解决这个阶段的数据库性能问题

    阶段四:企业发展越来越好了,业务越来越大了,做了读写分离数据库压力还是越来越大,这时候怎么办呢,一台数据库扛不住,那我们就分几台吧,做分库分表,对表做垂直拆分,对库做水平拆分。以扩数据库为例,扩出两台数据库,以一定的单号(例如交易单号),以一定的规则(例如取模),交易单号对2取模为0的丢到数据库1去,交易单号对2取模为1的丢到数据库2去,通过这样的方式将写数据库的流量均分到两台数据库上。一般分库分表会使用Shard的方式,通过一个中间件,便于连接管理、数据监控且客户端无需感知数据库ip

    关系型数据库的优点

    上面的方式,看似可以解决问题(实际上确实也能解决很多问题),正常对关系型数据库做一下读写分离 + 分库分表,支撑个1W+的读写QPS还是问题不大的。但是受限于关系型数据库本身,这套架构方案依然有着明显的不足,下面对利用关系型数据库方式做存储的方案的优点先进行一下分析,后一部分再分析一下缺点,对某个技术的优缺点的充分理解是技术选型的前提。

    1. 易理解
        因为行 + 列的二维表逻辑是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型更加容易被理解

    2. 操作方便
        通用的SQL语言使得操作关系型数据库非常方便,支持join等复杂查询,Sql + 二维关系是关系型数据库最无可比拟的优点,这种易用性非常贴近开发者

    3. 数据一致性
        支持ACID特性,可以维护数据之间的一致性,这是使用数据库非常重要的一个理由之一,例如同银行转账,张三转给李四100元钱,张三扣100元,李四加100元,而且必须同时成功或者同时失败,否则就会造成用户的资损

    4. 数据稳定
        数据持久化到磁盘,没有丢失数据风险,支持海量数据存储

    5. 服务稳定
        最常用的关系型数据库产品MySql、Oracle服务器性能卓越,服务稳定,通常很少出现宕机异常

    关系型数据库的缺点

    紧接着的,我们看一下关系型数据库的缺点,也是比较明显的。

    1. 高并发下IO压力大
        数据按行存储,即使只针对其中某一列进行运算,也会将整行数据从存储设备中读入内存,导致IO较高

    2. 为维护索引付出的代价大
        为了提供丰富的查询能力,通常热点表都会有多个二级索引,一旦有了二级索引,数据的新增必然伴随着所有二级索引的新增,数据的更新也必然伴随着所有二级索引的更新,这不可避免地降低了关系型数据库的读写能力,且索引越多读写能力越差。有机会的话可以看一下自己公司的数据库,除了数据文件不可避免地占空间外,索引占的空间其实也并不少

    3. 为维护数据一致性付出的代价大
        数据一致性是关系型数据库的核心,但是同样为了维护数据一致性的代价也是非常大的。我们都知道SQL标准为事务定义了不同的隔离级别,从低到高依次是读未提交、读已提交、可重复度、串行化,事务隔离级别越低,可能出现的并发异常越多,但是通常而言能提供的并发能力越强。那么为了保证事务一致性,数据库就需要提供并发控制与故障恢复两种技术,前者用于减少并发异常,后者可以在系统异常的时候保证事务与数据库状态不会被破坏。对于并发控制,其核心思想就是加锁,无论是乐观锁还是悲观锁,只要提供的隔离级别越高,那么读写性能必然越差

    4. 水平扩展后带来的种种问题难处理
        前文提过,随着企业规模扩大,一种方式是对数据库做分库,做了分库之后,数据迁移(1个库的数据按照一定规则打到2个库中)、跨库join(订单数据里有用户数据,两条数据不在同一个库中)、分布式事务处理都是需要考虑的问题,尤其是分布式事务处理,业界当前都没有特别好的解决方案

    5. 表结构扩展不方便
        由于数据库存储的是结构化数据,因此表结构schema是固定的,扩展不方便,如果需要修改表结构,需要执行DDL(data definition language)语句修改,修改期间会导致锁表,部分服务不可用

    6. 全文搜索功能弱
        例如like “%中国真伟大%”,只能搜索到"2019年中国真伟大,爱祖国",无法搜索到"中国真是太伟大了"这样的文本,即不具备分词能力,且like查询在"%中国真伟大"这样的搜索条件下,无法命中索引,将会导致查询效率大大降低

    写了这么多,我的理解核心还是前三点,它反映出的一个问题是关系型数据库在高并发下的能力是有瓶颈的,尤其是写入/更新频繁的情况下,出现瓶颈的结果就是数据库CPU高、Sql执行慢、客户端报数据库连接池不够等错误,因此例如万人秒杀这种场景,我们绝对不可能通过数据库直接去扣减库存。

    可能有朋友说,数据库在高并发下的能力有瓶颈,我公司有钱,加CPU、换固态硬盘、继续买服务器加数据库做分库不就好了,问题是这是一种性价比非常低的方式,花1000万达到的效果,换其他方式可能100万就达到了,不考虑人员、服务器投入产出比的Leader就是个不合格的Leader,且关系型数据库的方式,受限于它本身的特点,可能花了钱都未必能达到想要的效果。至于什么是花100万就能达到花1000万效果的方式呢?可以继续往下看,这就是我们要说的NoSql。

    结合NoSql的方式做存储的架构演进

    像上文分析的,数据库作为一种关系型数据的存储引擎,存储的是关系型数据,它有优点,同时也有明显的缺点,因此通常在企业规模不断扩大的情况下,不会一味指望通过增强数据库的能力来解决数据存储问题,而是会引入其他存储,也就是我们说的NoSql。

    NoSql的全称为Not Only SQL,泛指非关系型数据库,是对关系型数据库的一种补充,特别注意补充这两个字,这意味着NoSql与关系型数据库并不是对立关系,二者各有优劣,取长补短,在合适的场景下选择合适的存储引擎才是正确的做法。

    比较简单的NoSql就是缓存:
    在这里插入图片描述

    针对那些读远多于写的数据,引入一层缓存,每次读从缓存中读取,缓存中读取不到,再去数据库中取,取完之后再写入到缓存,对数据做好失效机制通常就没有大问题了。通常来说,缓存是性能优化的第一选择也是见效最明显的方案。

    但是,缓存通常都是KV型存储且容量有限(基于内存),无法解决所有问题,于是再进一步的优化,我们继续引入其他NoSql:
    在这里插入图片描述
    数据库、缓存与其他NoSql并行工作,充分发挥每种NoSql的特点。当然NoSql在性能方面大大优于关系挺数据库的同时,往往也伴随着一些特性的缺失,比较常见的就是事务功能的缺失。

    下面看一下常用的NoSql及他们的代表产品,并对每种NoSql的优缺点和适用场景做一下分析,便于熟悉每种NoSql的特点,方便技术选型。

    KV型NoSql(代表----Redis)

    KV型NoSql顾名思义就是以键值对形式存储的非关系型数据库,是最简单、最容易理解也是大家最熟悉的一种NoSql,因此比较快地带过。Redis、MemCache是其中的代表,Redis又是KV型NoSql中应用最广泛的NoSql,KV型数据库以Redis为例,最大的优点我总结下来就两点:

    1. 数据基于内存,读写效率高
    2. KV型数据,时间复杂度为O(1),查询速度快

    因此,KV型NoSql最大的优点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可达到10万的级别,性能非常强劲。同样的Redis也有所有KV型NoSql都有的比较明显的缺点:

    1. 只能根据K查V,无法根据V查K
    2. 查询方式单一,只有KV的方式,不支持条件查询,多条件查询唯一的做法就是数据冗余,但这会极大的浪费存储空间
    3. 内存是有限的,无法支持海量数据存储
    4. 同样的,由于KV型NoSql的存储是基于内存的,会有丢失数据的风险

    综上所述,KV型NoSql最合适的场景就是缓存的场景:

    1. 读远多于写
    2. 读取能力强
    3. 没有持久化的需求,可以容忍数据丢失,反正丢了再查询一把写入就是了

    例如根据用户id查询用户信息,每次根据用户id去缓存中查询一把,查到数据直接返回,查不到去关系型数据库里面根据id查询一把数据写到缓存中去。

    搜索型NoSql(代表----ElasticSearch)

    传统关系型数据库主要通过索引来达到快速查询的目的,但是在全文搜索的场景下,索引是无能为力的,like查询一来无法满足所有模糊匹配需求,二来使用限制太大且使用不当容易造成慢查询,搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题,ElasticSearch是搜索型NoSql的代表产品。

    全文搜索的原理是倒排索引,我们看一下什么是倒排索引。要说倒排索引我们先看下什么是正排索引,传统的正排索引是文档–>关键字的映射,例如"Tom is my friend"这句话,会将其切分为"Tom"、“is”、“my”、"friend"四个单词,在搜索的时候对文档进行扫描,符合条件的查出来。这种方式原理非常简单,但是由于其检索效率太低,基本没什么实用价值。

    倒排索引则完全相反,它是关键字–>文档的映射,我用张表格展示一下就比较清楚了:
    在这里插入图片描述
    意思是我现在这里有四个短句:
    “Tom is Tom”
    “Tom is my friend”
    “Thank you, Betty”
    “Tom is Betty’s husband”
    搜索引擎会根据一定的切分规则将这句话切成N个关键字,并以关键字的维度维护关键字在每个文本中的出现次数。这样下次搜索"Tom"的时候,由于Tom这个词语在"Tom is Tom"、“Tom is my friend”、"Tom is Betty’s husband"三句话中都有出现,因此这三条记录都会被检索出来,且由于"Tom is Tom"这句话中"Tom"出现了2次,因此这条记录对"Tom"这个单词的匹配度最高,最先展示。这就是搜索引擎倒排索引的基本原理,假设某个关键字在某个文档中出现,那么倒排索引中有两部分内容:

    1. 文档ID
    2. 在该文档中出现的位置情况

    可以举一反三,我们搜索"Betty Tom"这两个词语也是一样,搜索引擎将"Betty Tom"切分为"Tom"、"Betty"两个单词,根据开发者指定的满足率,比如满足率=50%,那么只要记录中出现了两个单词之一的记录都会被检索出来,再按照匹配度进行展示。

    搜索型NoSql以ElasticSearch为例,它的优点为:

    1. 支持分词场景、全文搜索,这是区别于关系型数据库最大特点
    2. 支持条件查询,支持聚合操作,类似关系型数据库的Group By,但是功能3. 更加强大,适合做数据分析
    3. 数据写文件无丢失风险,在集群环境下可以方便横向扩展,可承载PB级别的数据
    4. 高可用,自动发现新的或者失败的节点,重组和重新平衡数据,确保数据是安全和可访问的

    同样,ElasticSearch也有比较明显的缺点:

    1. 性能全靠内存来顶,也是使用的时候最需要注意的点,非常吃硬件资源、吃内存,大数据量下64G + SSD基本是标配,算得上是数据库中的爱马仕了。为什么要专门提一下内存呢,因为内存这个东西是很值钱的,相同的配置多一倍内存,一个月差不多就要多花几百块钱,至于ElasticSearch内存用在什么地方,大概有如下这些:
      Indexing Buffer----ElasticSearch基于Luence,Lucene的倒排索引是先在内存里生成,然后定期以Segment File的方式刷磁盘的,每个Segment File实际就是一个完整的倒排索引
      Segment Memory----倒排索引前面说过是基于关键字的,Lucene在4.0后会将所有关键字以FST这种数据结构的方式将所有关键字在启动的时候全量加载到内存,加快查询速度,官方建议至少留系统一半内存给Lucene
      各类缓存----Filter Cache、Field Cache、Indexing Cache等,用于提升查询分析性能,例如Filter Cache用于缓存使用过的Filter的结果集
      Cluter State Buffer----ElasticSearch被设计为每个Node都可以响应用户请求,因此每个Node的内存中都包含有一份集群状态的拷贝,一个规模很大的集群这个状态信息可能会非常大
    2. 读写之间有延迟,写入的数据差不多1s样子会被读取到,这也正常,写入的时候自动加入这么多索引肯定影响性能
    3. 数据结构灵活性不高,ElasticSearch这个东西,字段一旦建立就没法修改类型了,假如建立的数据表某个字段没有加全文索引,想加上,那么只能把整个表删了再重建

    因此,搜索型NoSql最适用的场景就是有条件搜索尤其是全文搜索的场景,作为关系型数据库的一种替代方案。

    另外,搜索型数据库还有一种特别重要的应用场景。我们可以想,一旦对数据库做了分库分表后,原来可以在单表中做的聚合操作、统计操作是否统统失效?例如我把订单表分16个库,1024张表,那么订单数据就散落在1024张表中,我想要统计昨天浙江省单笔成交金额最高的订单是哪笔如何做?我想要把昨天的所有订单按照时间排序分页展示如何做?这就是搜索型NoSql的另一大作用了,我们可以把分表之后的数据统一打在搜索型NoSql中,利用搜索型NoSql的搜索与聚合能力完成对全量数据的查询。

    至于为什么把它放在KV型NoSql后面作为第二个写呢,因为通常搜索型NoSql也会作为一层前置缓存,来对关系型数据库进行保护。

    列式NoSql(代表----HBase)

    列式NoSql,大数据时代最具代表性的技术之一了,以HBase为代表。

    列式NoSql是基于列式存储的,那么什么是列式存储呢,列式NoSql和关系型数据库一样都有主键的概念,区别在于关系型数据库是按照行组织的数据:
    在这里插入图片描述
    看到每行有name、phone、address三个字段,这是行式存储的方式,且可以观察id = 2的这条数据,即使phone字段没有,它也是占空间的。

    列式存储完全是另一种方式,它是按每一列进行组织的数据:
    在这里插入图片描述
    在这里插入图片描述
    这么做有什么好处呢?大致有以下几点:

    1. 查询时只有指定的列会被读取,不会读取所有列
    2. 存储上节约空间,Null值不会被存储,一列中有时候会有很多重复数据(尤其是枚举数据,性别、状态等),这类数据可压缩,行式数据库压缩率通常在3:15:1之间,列式数据库的压缩率一般在8:130:1左右
    3. 列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中

    第二点说到了数据压缩,什么意思呢,以比较常见的字典表压缩方式举例:
    在这里插入图片描述
    自己看图理解一下,应该就懂了。

    接着继续讲讲优缺点,列式NoSql,以HBase为代表的,优点为:

    1. 海量数据无限存储,PB级别数据随便存,底层基于HDFS(Hadoop文件系统),数据持久化
    2. 读写性能好,只要没有滥用造成数据热点,读写基本随便玩
    3. 横向扩展在关系型数据库及非关系型数据库中都是最方便的之一,只需要4添加新机器就可以实现数据容量的线性增长,且可用在廉价服务器上,节省成本
    4. 本身没有单点故障,可用性高
    5. 可存储结构化或者半结构化的数据
    6. 列数理论上无限,HBase本身只对列族数量有要求,建议1~3个

    说了这么多HBase的优点,又到了说HBase缺点的时候了:

    1. HBase是Hadoop生态的一部分,因此它本身是一款比较重的产品,依赖很多Hadoop组件,数据规模不大没必要用,运维还是有点复杂的
    2. KV式,不支持条件查询,或者说条件查询非常非常弱吧,HBase在Scan扫描一批数据的情况下还是提供了前缀匹配这种API的,条件查询除非定义多个RowKey做数据冗余
    3. 不支持分页查询,因为统计不了数据总数

    因此HBase比较适用于那种KV型的且未来无法预估数据增长量的场景,另外HBase使用还是需要一定的经验,主要体现在RowKey的设计上。

    文档型NoSql(代表----MongoDB)

    什么是文档型NoSql呢,文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML格式存储数据,因此文档型NoSql是没有Schema的,由于没有Schema的特性,我们可以随意地存储与读取数据,因此文档型NoSql的出现是解决关系型数据库表结构扩展不方便的问题的。

    MongoDB是文档型NoSql的代表产品,同时也是所有NoSql产品中的明星产品之一,因此这里以MongoDB为例。按我的理解,作为文档型NoSql,MongoDB是一款完全和关系型数据库对标的产品,就我们从存储上来看:
    在这里插入图片描述
    看到,关系型数据库是按部就班地每个字段一列存,在MongDB里面就是一个JSON字符串存储。关系型数据可以为name、phone建立索引,MongoDB使用createIndex命令一样可以为列建立索引,建立索引之后可以大大提升查询效率。其他方面而言,就大的基本概念,二者之间基本也是类似的:
    在这里插入图片描述
    因此,对于MongDB,我们只要理解成一个Free-Schema的关系型数据库就完事了,它的优缺点比较一目了然,优点:

    1. 没有预定义的字段,扩展字段容易
    2. 相较于关系型数据库,读写性能优越,命中二级索引的查询不会比关系型数据库慢,对于非索引字段的查询则是全面胜出

    缺点在于:

    1. 不支持事务操作,虽然Mongodb4.0之后宣称支持事务,但是效果待观测
    2. 多表之间的关联查询不支持(虽然有嵌入文档的方式),join查询还是需要多次操作
    3. 空间占用较大,这个是MongDB的设计问题,空间预分配机制 + 删除数据后空间不释放,只有用db.repairDatabase()去修复才能释放
    4. 目前没发现MongoDB有关系型数据库例如MySql的Navicat这种成熟的运维工具

    总而言之,MongDB的使用场景很大程度上可以对标关系型数据库,但是比较适合处理那些没有join、没有强一致性要求且表Schema会常变化的数据。

    总结:数据库与NoSql及各种NoSql间的对比

    最后一部分,做一个总结,本文归根到底是两个话题:

    1. 何时选用关系型数据库,何时选用非关系型数据库
    2. 选用非关系型数据库,使用哪种非关系型数据库

    首先是第一个话题,关系型数据库与非关系型数据库的选择,在我理解里面无非就是两点考虑:
    在这里插入图片描述

    第一点,不多解释应该都理解,非关系型数据库都是通过牺牲了ACID特性来获取更高的性能的,假设两张表之间有比较强的一致性需求,那么这类数据是不适合放在非关系型数据库中的。

    第二点,核心数据不走非关系型数据库,例如用户表、订单表,但是这有一个前提,就是这一类核心数据会有多种查询模式,例如用户表有ABCD四个字段,可能根据AB查,可能根据AC查,可能根据D查,假设核心数据,但是就是个KV形式,比如用户的聊天记录,那么HBase一存就完事了。

    这几年的工作经验来看,非核心数据尤其是日志、流水一类中间数据千万不要写在关系型数据库中,这一类数据通常有两个特点:

    写远高于读
    写入量巨大

    一旦使用关系型数据库作为存储引擎,将大大降低关系型数据库的能力,正常读写QPS不高的核心服务会受这一类数据读写的拖累。

    接着是第二个问题,如果我们使用非关系型数据库作为存储引擎,那么如何选型?其实上面的文章基本都写了,这里只是做一个总结(所有的缺点都不会体现事务这个点,因为这是所有NoSql相比关系型数据库共有的一个问题):
    在这里插入图片描述
    但是这里特别说明,选型一定要结合实际情况而不是照本宣科,比如:

    1. 企业发展之初,明明一个关系型数据库就能搞定且支撑一年的架构,搞一套大而全的技术方案出来
    2. 有一些数据条件查询多,更适合使用ElasticSearch做存储降低关系型数据库压力,但是公司成本有限,这种情况下这类数据可以尝试继续使用关系型数据库做存储
    3. 有一类数据格式简单,就是个KV类型且增长量大,但是公司没有HBase这方面的人才,运维上可能会有一定难度,出于实际情况考虑,可先用关系型数据库顶一阵子

    所以,如果不考虑实际情况,虽然合适有些存储引擎更加合适,但是强行使用反而适得其反,总而言之,适合自己的才是最好的。

    展开全文
  • 1、认识关系型数据库 1.1.1 什么是关系型数据库 1.1.2 实体关系模型 1.1.3 关系型数据库管理系统RDBMS 1.1.4 使用SQL语言管理数据库 1、认识关系型数据库 数据库简而言之就是数据的集合,它是由文件系统存储...
  • 1.Python操作mysql关系型数据库MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS ...
  • 关系型数据库的发展历史

    千次阅读 2019-03-12 23:15:03
    数据库发展史 信息系统产生了海量的数据,有数据必须要有数据的存放位置, 无库时代 :没有专门的...非关系型数据库:为适应水平扩展性和处理超大量的数据环境,近几年发展非常迅速的发展,衍生类型非常多。 本...
  • 关系型数据库 分布式数据库 关系SQL数据库 (自1980年代以来一直存在)在历史上一直在大型机或单个服务器上运行-这就是我们所拥有的。 如果希望数据库处理更多数据并更快地运行,则必须将其放在具有更多,更快的CPU...
  • 文章目录一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库二、关系数据库与非关系型数据库区别1、数据存储方式不同2、扩展方式不同3、对事务性的支持不同三、非关系型数据库产生背景四、Redis...
  • 参考...http://wiki.jikexueyuan.com/project/mysql/introduction.html 数据库类型 特性 优点 缺点 ... 关系型数据库SQLite、Oracle、mysql 1、关系型数据库,是指采用了关系模型...
  • MySQL(关系型数据库管理系统)

    千次阅读 2018-01-03 19:13:00
    MySQL 关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系...
  • mySQL关系型数据库管理系统)

    千次阅读 2017-03-13 08:32:00
    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System...
  • 1.MySQL能在所有主流平台上运行。 2.Oracle也能在所有主流平台上运行。 3.SQL server只能在Windows上运行,没有丝毫的开放性,操作系统的稳定对数据库是十分重要的。而且Windows平台的可靠性,安全性和伸缩性是非常...
  • 数据库MySQL详解

    万次阅读 多人点赞 2018-07-24 20:03:47
    全网最详细MySQL教程,2021.1再次更新70%的内容,MySQL 8.0 + Navicat 15
  • SQL的应用场景是关系型数据库,比如我们常用的Oracle、MySQL,这些就是关系型数据库。 我们理解数据库的时候,往往会从表的结构入手去理解。数据库当中存储的是一张张的表,表是一行行数据组成的,而每一行数据都有...
  • 关系型数据库

    千次阅读 热门讨论 2017-02-05 21:43:20
    开发人员刚刚开始学习的时候,最先接触的应该就是关系型数据库,那么,为什么叫做关系型数据库关系型数据库有什么优点呢,下面,咱们一起来探讨一下。什么是关系型数据库?关系数据库(英语:Relational database...
  • 使用Node做Web页面开发,基本上是连接非关系型数据库mongodb,而这里我还是先尝试连接了一下mysql数据库,因为相对于mysql来说mongodb过于生疏,想着快速出来页面,所以选择相对熟悉一些的mysql。 1. 安装mysql 下载...
  • 原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手。 在我们正式的大数据团队,数仓(数据仓库Hive+HBase)的数据收集同样来自Oracle或MySql,处理后的统计结果和明细,尽管保存...
  • 需求描述:快速生产关系型数据库表关系ER图 在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便。 例如:公司某一个系统的库有三百张表,在...
  • Mysql 数据库(一)—— 初识 Mysql

    千次阅读 多人点赞 2021-08-02 21:20:09
    Mysql 数据库(一) 前一段时间 ,我们完成了 Java 集合与数据结构的学习 , 之后我们将进入 Mysql 数据库的课程中。 一、数据库 首先我们要学习的是数据库的知识,那么数据库 到底是什么呢? 同时我们在刚开始学习 ...
  • mySQL关系型数据库管理系统)编辑

    万次阅读 2014-11-05 18:35:24
    收藏 2906 1034 ...mySQL关系型数据库管理系统)编辑 ...MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用
  • 数据库和关系型数据库 作为一个程序员,不了解数据库怎么能行,那么数据库到底是个啥呢,作为一个Java工程师,平时和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。 根据百度百科的介绍...
  • MySQL 8.0 中 4 个默认的系统数据库

    千次阅读 2020-06-11 22:11:02
    MySQL 8.0 默认安装的 4 个系统数据库mysql 数据库存储了 MySQL 服务器正常运行所需的各种信息;information_schema 提供了访问数据库元数据的各种视图,包括数据库、表、字段类型以及访问权限等; performance_...
  • 关系型数据库与NoSQL数据库场景说明

    千次阅读 2016-05-19 15:24:02
    一个程序员很有必要熟悉或者精通一种数据库,MySQL无疑是首选。为什么使用MySQL呢,因为它是开源的,同时具备轻量、简单、稳定和高性能等...关系型数据库把所有的数据都通过行和列的二元表现形式表示出来。它的优势:
  • mysql数据库大作业

    千次阅读 2021-01-16 00:15:09
    第一,采用 MYSQL 数据库技术,将客房...目的还是通过 操作 eclipse 来操纵数据库里面的数据,将我们 web 网站里面需要的文本,数据统统都保 存到 mysql 数据库里面,也就是说当我们需要其中的学生和用户的......目的...
  • Oracle 数据库、Microsoft SQL Server、MySQL 数据库是我们在项目开发过程中最为常见的三种关系型数据库。下面我们分别从不同的角度对这三种数据库做一个深度剖析和区分,便于我们在开发中更为熟练地选择合适的...
  • MySQL 是一个小型的关系型数据库管理系统,是一个真正多用户、多线程的结构化查询语言(SQL)数据库服务器。MySQL运行速度快、执行效率与稳定性高、操作简单、非常易于使用,是目前最流行的数据库管理系统之一。 ...
  • 基于Docker安装关系型数据库PostgrelSQL替代Mysql基于Docker安装关系型数据库PostgrelSQL替代Mysql首先需要拉取PostgrelSQL的镜像拉取成功之后查看拉取的镜像然后我们就可以将容器启动了输入命令来查看容器运行状态...
  • 什么是 Amazon Relational Database Service (Amazon RDS)? Amazon Relational Database ...它可以经济有效的为用户提供一个容量可调的行业标准的关系数据库,并承担常见的数据库管理任务。 Amazon RDS 概述 您为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,860
精华内容 13,944
热门标签
关键字:

熟悉mysql关系型数据库

mysql 订阅