步伐员中一直有一个段子广为流传:大不了我们“删库跑路”
由此可见作为一个步伐员,不了解数据库怎么能行,那么数据库到底是个啥呢,作为一个Java工程师,寻常和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。
根据百度百科的介绍,数据库是“按照数据结构来组织、存储和管理数据的堆栈”。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据聚集。
数据库是以肯定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用步伐彼此独立的数据聚集,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
是不是没听懂,好吧,简单来说,像MySQL这样的数据库,就是用于存储结构化数据的,好比一个学生的信息数据,一个商品的数据,或者是一个学生购买商品的消费数据。
遐想到寻常我们经常使用的Excel,其实和数据库挺像的,数据库其实就是一个表格,里面有许多的数据类型,好比字符串,好比数字,再好比长文本等等。
而这类数据库也叫关系型数据库,典范代表就是MySQL。
再看看百度百科的介绍,关系型数据库,是指采用了关系模子来组织数据的数据库,其以行和列的情势存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定命据库中某些区域的实验代码。关系模子可以简单理解为二维表格模子,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
除了关系型数据库之外,近些年来另有许多nosql(not only sql)数据库在兴起,好比MongoDB,以及图数据库、列式数据库等等,这些数据库对于新手步伐员来说用的并不多,以是本文我们只讨论关于关系型数据库的内容。
关系型数据库是我们步伐员寻常用的最多,也最简单易上手的数据库类型,以是,学习数据库一样寻常也从MySQL这类关系型数据库入手,一来它简单好学,二来它是免费的。
学习数据库,先从SQL入手
说到MySQL,就不得不谈谈SQL了,sql,按照百科的说法是这样的
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和步伐设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
对于不同的数据库,sql的写法可能有一些差别,但是大抵都是相同的,就拿MySQL来说,寻常我们用到最多的就是select、update、delete和insert了,这类操作统称为数据操纵语言DML(Data Manipulation Language),用户通过它可以实现对数据库的根本操作。
固然另有操作数据库和表的一些ddl,数据库模式界说语言DDL(Data Definition Language),是用于描述数据库中要存储的实际世界实体的语言。 简单来说,ddl其实就是用来实验建表,删表,更改表结构等操作的
以前我的sql写的并不多,毕竟简单的增删改查并不必要多复杂的sql技巧,最多就是做一下表连接。
再到后来,我开始做一些项目,打仗了ORM的一些框架,好比hibernate和mybatis,这些框架甚至可以让你完全不写sql,只要调用一些增删改查的API即可,这让我很长一段时间都忽略了SQL的重要性。
其实学习sql最复杂的地方并不是一些高级用法,而是在于实际场景中的应用和优化。两条sql,可能因为简单的差别就会有很大的性能差距,差别点可能是,好比有没有走到索引,是否是全表扫描,又或者走到了哪个索引,而这样的性能分析只有在实际的场景里才有意义。
固然了,对于新手来说,学习sql的语法是放在第一位的,然后才能渐渐过渡到会使用,会优化,会分析。
数据库根本原理
学习数据库,你必要先打好基础,数据库原理是计算机科班的一门必修课,非科班的我选择的是自学,我其时也是拿着那本大学课本《数据库系统概论》来自学的。
课本这种东西,肯定还是偏理论的一点,我们要了解的内容主要包含几个方面
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的整体架构
客户端
也就是我们经常用的可视化工具,好比Navicat for MySQL
服务端
就是我们安装的MySQL步伐,其实打开它它就是一个MySQL的服务端进程
sql实验层
sql实验层主要负责剖析实验sql,里面包含了许多复杂的组成部分,好比解释器,分析器,优化器等等,实验层会生成一个sql的实验筹划,这个筹划也经常是我们分析sql性能的一个重要参考内容
存储引擎层
存储引擎层是innodb了,好比数据要如组织和存放,索引要如何建立和管理等等,加锁怎么加,事务如何实现,都是这一层要考虑的内容。
文件系统层
存储引擎的下一层就是文件系统了,数据库的数据如何和文件系统进行交互,就是这一层要做的事变了。
索引
不得不说,索引绝对是数据库中最经常考察,考点也最多的内容了。
好比给你一条sql,那么它能否命中索引,能命中哪些索引,如果想要命中某个索引,你应该如何修改,这种题目口试时是不是经常看到,变来变去这么多题型,其实口试官就是想考察你对于索引的理解。
另有就是,索引的数据结构,一样是非常热门的考点之一,索引其实是基于B+树来实现的,不知道b+树是啥,请回去看数据结构。
简单来说,它是一种多路搜索树,致力于更短的时间来完成数据检索,因为它的高度比二叉树要低,而比起普通的b树,它的非叶节点只起索引作用,而叶子节点是次序串联的,以是非常得当做搜索树。
如果你理解了这一点,那么面临此类口试题就可以更加从容一些,口试官其实就是想知道你对b+树的了解到了什么样的水平而已。
事务和锁
除了索引之外,数据库中最复杂的内容可能就是事务和锁了。
就拿事务的ACID特性来说,你必要了解每个大写字母背后的实现原理,好比原子性是如何实现的,同等性是如何保证的,背后的原理是什么。
我们寻常常用的事务可能就是spring里的事务模板,在事务里实验的同库数据库操作,要么都成功,要么都失败,这就是原子性。
两个事务之间互不影响,这就是隔离性,固然了,这里又涉及到了事务隔离级别。
事务隔离级别包括读未提交,读已提交,可重复读和序列化,每个事务隔离级别都适用于某种数据库读写场景,许多时候,我们都必要搞懂隔离级别背后的原理,才能更好地适用它。
MySQL里默认使用可重复读的隔离级别,这个级别根本上可以保证我们的事务按照预期实验,在MySQL中,这个事务隔离级别甚至可以解决幻读的题目。
在MySQL的事务背后,其实有一个隐蔽的boss,那就是数据库的锁,许多事务的隔离级别都是通过锁来实现的,好比可重复读只要加行锁就可以实现了,而幻读则必要加上间隙锁next-key lock来实现。
行级锁和表级锁是MySQL中的两种锁,表级锁顾名思义,会直接锁表,一次只有一个事务能够访问,而行级锁其实锁的也并非是一行,在MySQL中,这个锁加在索引上,而这个索引对应的数据每每不止一行,以是这个行级锁只是理论意义上的"行级锁"
数据库事务的四原则
数据库事务ACID四大原则:
A代表Atomicity,即原子性。
C表示Consistency,即同等性。
I表示Isolation,即隔离性。
D表示Durability,即长期性。
这四个原则了解过数据库的应该都如雷贯耳。可是真正口试的时候被问起来,能一个不落说得上来,而且讲得清楚原委的就不多了。我以为主要是因为我们的翻译过于文雅,不像英文那么直观,以是很难顾名思义。另一个原因是我们在学习的时候理解不够深入,只知道原因,不知道原因的究竟。所谓知其然,不知其以是然。
最后摆上学习资料
以上内容都是我自己的一些感想,分享出来接待各人指正,顺便求一波关注,里面的资料各位小伙伴关注我后私信【Java】就可以免费领取~ |