本文思维导图和关系型数据库作为一个程序员,到底是个啥?

图片[1]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

本文思维导图

图片[2]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

数据库和关系型数据库

作为一个程序员,不了解数据库如何能行,这么数据库究竟是个啥呢,作为一个Java工程师,平常和数据库打交道着实不少,所谓的CRUD似乎就是对数据库进行增删改查的操作。

按照百度百科的介绍,数据库是“按照数据结构来组织、存储和管理数据的库房”。是一个常年储存在计算机内的、有组织的、有共享的、统一管理的数据集合。

数据库是以一定形式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

是不是没听懂,好吧,简单来说,像MySQL这样的数据库,就是用于储存结构化数据的,例如一个中学生的信息数据,一个商品的数据,或则是一个中学生订购商品的消费数据。

联想到平常我们常常使用的Excel,虽然和数据库挺像的,数据库虽然就是一个表格,上面有好多的数据类型,例如字符串sql停留在安装程序文件sql停留在安装程序文件,例如数字,再例如长文本等等。

而这类数据库也叫关系型数据库,典型代表就是MySQL。

再瞧瞧百度百科的介绍,关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的方式储存数据,以易于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中个别区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

不仅关系型数据库之外,近年来还有好多nosql(notonlysql)数据库在盛行,例如MongoDB,以及图数据库、列式数据库等等,这种数据库对于菜鸟程序员来说用的并不多,所以本文我们只讨论关于关系型数据库的内容。

关系型数据库是我们程序员平常用的最多,也最简单易上手的数据库类型,所以,学习数据库通常也从MySQL这类关系型数据库入手,一来它简单好学,二来它是免费的。

我的数据库学习历程

我第一次据说“数据库”这个词还是在学院的时侯,那时侯正值你们找工作,有一个朋友和我们分享自己的求职经验,据他所说,每位公司还会考察你的数据库知识,学好了数据库,笔试哪些公司都不怕。

当时我还认为挺唬人的,不过我们中学确实没来哪些大公司,我对此半信半疑,至于究竟是不是这样,后来也就没再追究了。

第二次接触数据库,是在学习Java的时侯,记得当年自己跟随一个小教程,下载安装了MySQL,之后从网上下载了demo代码,用当时先进的开发工具eclipse跑通了他人家的代码,当然就是增删改查。

图片[3]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

只不过当时对这种东西也没啥概念,后来又下载了一个db的可视化工具,可以更便捷地了解自己的数据库里究竟都有啥。

再到后来,我开始渐渐接触项目实战,使用数据库的时间也越来越长,自以为对于数据库的理解还算可以,直至我真正地接触了数据库相关的笔试题,才让我发觉自己对于数据库的理解是多么的庸俗。

那种时侯,我只懂写一些简单的crud,甚至连内外联接、groupby和count等一些简单的sql用法都不了解,除此之外,我对于数据库的一些原理性内容几乎也是一窍不通的,例如数据库的索引、事务、锁机制,我统统不晓得,更别谈怎样回答相关的笔试题了。

于是,我开始意识到学习数据库原理是多么重要的一件事情,我开始看数据库方面的书籍,从最基础的数据库教材,再到MySQL的原理性内容,再到mybatis这类orm框架的实现,我都渐渐地开始学习和了解,直至我还能对大部份的数据库笔试题都较好地把握。

而如今,我在一个每晚要处理海量数据的公司里工作,对于数据方面的学习早已不仅仅逗留在数据库了,我还要接触数据库房、分布式数据库以及各类大数据的应用场景,学习数据知识的公路看来短时间内是走不完了。

学习数据库,先从SQL入手

图片[4]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

说到MySQL,就不得不说说SQL了,sql,根据百科的说法是这样的

结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

对于不同的数据库,sql的写法可能有一些差别,然而大致都是相同的,就拿MySQL来说,平常我们用到最多的就是select、update、delete和insert了,这类操作也称为数据操纵语言DML(DataManipulationLanguage),用户通过它可以实现对数据库的基本操作。

其实还有操作数据库和表的一些ddl,数据库模式定义语言DDL(DataDefinitionLanguage),是用于描述数据库中要储存的现实世界实体的语言。简单来说,ddl似乎就是拿来执行建表,删表,修改表结构等操作的

先前我的sql写的并不多,虽然简单的增删改查并不须要多复杂的sql方法,最多就是做一下表联接。

再到后来,我开始做一些项目,接触了ORM的一些框架,例如hibernate和mybatis,这种框架甚至可以让你完全不写sql,只要调用一些增删改查的API即可,这让我很长一段时间都忽视了SQL的重要性。

虽然学习sql最复杂的地方并不是一些中级用法,而是在于实际场景中的应用和优化。两条sql,可能由于简单的差别都会有很大的性能差别,差别点可能是,例如有没有走到索引,是否是全表扫描,又或则走到了那个索引,而这样的性能剖析只有在实际的场景里才有意义。

其实了,对于菜鸟来说,学习sql的句型是置于第一位的,之后才会逐步过渡到会使用,会优化,会剖析。

关于数据库的这些笔试题

图片[5]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

想要真正学好数据库,搞定笔试题中的相关问题,那你就必需要弄懂数据库的基本原理。

假如你不相信,那我随意举几个笔试题常见的题型,例如”数据库事务的ACID是哪些意思”、“数据库中有什么锁”、“数据库的索引用的是哪些数据结构”

前面几道题算是简易版的,在平时的笔试中也常常才能看见,即使你只是背一背答案,可能也多少能答对一些,这么假如再进一步,考察一下数据库的原理性知识,估计就没那么简单了。

举个板栗“数据库事务的ACID是怎样实现的”,“数据库中有什么锁,分别是怎样实现的,怎么使用”、“数据库中的索引是怎样实现的,何时命中索引,何时不能,为何“

是不是觉得难度一下子就上来了。虽然深入到原理性的东西,懂的人就越来越少了。除此之外,还有好多进阶的笔试题,更多时侯会结合实际场景来考察。

例如考察你对MySQL储存引擎innodb的理解,对于sql优化的理解,以及对于分布式场景下数据库能力的应用,例如分布式锁,分布式事务,以及分库分表的一些问题。

晓得了笔试题大约都考啥以后,接出来我们要做的就是找到根源所在,之后一一击破

数据库基本原理

图片[6]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

学习数据库,你须要先打好基础,数据库原理是计算机科班的一门选修课,非科班的我选择的是自学,我当时也是拿着那本学院教材《数据库系统导论》来自学的。

教材这些东西,肯定还是偏理论的一点,我们要了解的内容主要包含几个方面

1、数据库模型有什么:包括层次模型、网状模型和关系模型,我们所用的关系型数据库就是基于关系模型实现的。

2、关系数据库的基础和sql:了解关系数据库的基本概念,了解sql的基本使用方式,起码CRUD和一些常见用法要搞清

3、数据库的安全性和完整性,这两部份内容虽然理论的东西比较沉闷,实际上对应到实际场景中,安全性就是要保护数据的安全,包括权限控制和数据备份,而完整性则是通过一些约定和规范来限制数据库的储存内容,例如我们可以用字段、唯一键、非空等要求来限制数组的取值。

4、关系数据理论这部份内容很有意思,也比较复杂,提到了数据库的范式理论,从一范式到四范式,各有各的用法和要求,某互联网公司“第四范式”就是用这个概念来命名的。

5、事务和锁最后一部份内容,就是数据库的两个重要组成部份,事务和锁,事务可以保证一组数据库操作的ACID特点,特别适用于须要数据一致性的场景,而数据库的锁不可是实现事务的基础,还可以灵活地适用于不同的数据库应用场景,我们还可以通过sql句子来完成加锁和释放,对于并发场景尤其好使。

MySQL的实现原理

学习完了数据库基础以后,接出来就该学习MySQL了,虽然好多时侯我们的数据库应用就是MySQL。

虽然MySQL里的好多知识点和我们前面提及的数据库基础长治小异,而回到MySQL的实现层,我们就得来瞧瞧MySQL的储存引擎了。

MySQL的储存引擎分为innodb和myisam,相信你们对于这两个引擎区别的笔试题看了也不少,例如innodb支持事务,支持行级锁,而myisam不支持。

因为现今innodb基本上是主流,所以我们讨论MySQL的时侯基本上就是在讨论innodb。对于MySQL的实现原理,我觉得大约有那么一些内容须要我们去学习。

首先,我们了解MySQL里有什么数据类型,通常的用法怎样,之后,尝试用MySQL去跑一些sql句子,建库建表,加索引加字段,其实,这种实践能帮助你更好地学习上述内容。

想要更好地了解MySQL的原理,我们就必需要了解MySQL的整体构架,通常来说,MySQL从上到下可以分为那么几层

图片[7]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

顾客端

也就是我们常常用的可视化工具,例如NavicatforMySQL

服务端

就是我们安装的MySQL程序,虽然打开它它就是一个MySQL的服务端进程

sql执行层

sql执行层主要负责解析执行sql,上面包含了好多复杂的组成部份,例如例程,剖析器,优化器等等,执行层会生成一个sql的执行计划,这个计划也常常是我们剖析sql性能的一个重要参考内容

储存引擎层

储存引擎层是innodb了,例如数据要如组织和储存,索引要怎么构建和管理等等,加锁如何加,事务怎么实现,都是这一层要考虑的内容。

文件系统层

储存引擎的下一层就是文件系统了,数据库的数据怎么和文件系统进行交互,就是这一层要做的事情了。

索引

不得不说,索引绝对是数据库中最常常考察,考点也最多的内容了。

例如给你一条sql,这么它能够命中索引,能命中什么索引,假如想要命中某个索引,你应当怎样更改,这些问题笔试时是不是常常听到,变来变去那么多题型,虽然笔试官就是想考察你对于索引的理解。

还有就是,索引的数据结构,一样是十分热门的考点之一,索引似乎是基于B+树来实现的,不晓得b+树是啥,请回家看数据结构。

简单来说,它是一种多路搜索树,旨在于更短的时间来完成数据检索,由于它的高度比二叉树要低,而比起普通的b树,它的非叶节点只起索引作用,而叶子节点是次序串联的,所以特别适宜做搜索树。

假如你理解了这一点,这么面对这种笔试题就可以愈发从容一些,笔试官虽然就是想晓得你对b+树的了解到了哪些样的程度而已。

事务和锁

不仅索引之外,数据库中最复杂的内容可能就是事务和锁了。

就拿事务的ACID特点来说,你须要了解每位小写字母背后的实现原理,例如原子性是怎样实现的,一致性是怎样保证的,背后的原理是哪些。

我们平常常用的事务可能就是spring里的事务模板,在事务里执行的同库数据库操作,要么都成功,要么都失败,这就是原子性。

两个事务之间互不影响,这就是隔离性,其实了,这儿又涉及到了事务隔离级别。

事务隔离级别包括读未递交,读已递交,可重复读和序列化,每位事务隔离级别都适用于某种数据库读写场景,好多时侯,我们都须要看懂隔离级别背后的原理,能够更好地适用它。

MySQL里默认使用可重复读的隔离级别,这个级别基本上可以保证我们的事务依照预期执行,在MySQL中,这个事务隔离级别甚至可以解决幻读的问题。

在MySQL的事务背后,似乎有一个隐藏的boss,那就是数据库的锁,好多事务的隔离级别都是通过锁来实现的,例如可重复读只要加行锁就可以实现了,而幻读则须要加上间隙锁next-keylock来实现。

行级锁和表级锁是MySQL中的两种锁,表级锁顾名思义,会直接锁表,一次只有一个事务才能访问,而行级锁当然锁的也并非是一行,在MySQL中,这个锁加在索引上,而这个索引对应的数据常常不止一行,所以这个行级锁只是理论意义上的”行级锁”

说了如此多,要理解MySQL的事务和锁,还是要多瞧瞧相关的书籍和文章,理解其内部的实现原理,知其然也要知其所以然。

下边又到了我们熟悉的资源推荐环节

图片[8]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

推荐资源书籍

数据库

1《数据库系统导论》

数据库原理应当是教材吧,这本书作为数据库入门来说还是可以的,虽然不是专门做DB的,看大厚书好处不大,这本书把数据库的基本概念都讲完了。

2sql必知必会

图片[9]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

这本书主要是讲解sql句子如何写,虽然数据库最重要的一点就是要熟练地使用sql句子,其实这本书也可以当作工具书来使用。

3深入浅出MySQL

图片[10]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

这本书适宜作为MySQL的学习书籍,当你有了一定的MySQL使用经验后,可以瞧瞧它,该书从数据库的基础、开发、优化、管理维护和构架5个方面对MySQL进行了详尽的介绍,讲的不算非常深,并且足够我们使用了。这本书我也只看了一部份。

4MySQL技术黑幕:innodb储存引擎

图片[11]-本文思维导图和关系型数据库作为一个程序员,到底是个啥?-唐朝资源网

看完前面那本书之后,对MySQL算是比较熟悉了,不过对于笔试中常考的innodb引擎,还是推荐一下这本书把,专门讲解了innodb储存引擎的相关内容。我还没有细看,而且内容足够你学好innodb了。

总结

关于数据库的学习,明天就先提到这儿,希望本文可以帮助你快速地了解,关于数据库要学习什么内容,以及根据如何的一个步骤去学习。

对了,你想问我文章里提及的资源去哪找?我早已给你打算好了在我的公众号【程序员黄小斜】回复“数据库”即可申领对应的下载地址。

———————–公众号:程序员黄小斜(ID:AntCoder)博客:知乎:程序员黄小斜B站:黄小斜(求关注)

旨在于让更多人更轻松地自学编程,授人以鱼也要授人以渔

© 版权声明
THE END
喜欢就支持一下吧
点赞280赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容