怎么解!需要怎么解什么?

作为一个程序员不了解数据库怎么能行,那么数据库到底是个啥呢作为一个Java工程师,平时和数据库打交道着实不少所谓的CRUD其实就是对数据库进行增删改查的操作。

根据百度百科的介绍数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所用户可以对文件中的数据进行新增、查询、更新、删除等操作。

是不是没听懂好吧,简单来说像MySQL这样的数据库,就是用于存储结构化数据的比如一个学生的信息数据,一个商品的数据或者是一个学生购买商品的消費数据。
联想到平时我们经常使用的Excel其实和数据库挺像的,数据库其实就是一个表格里面有很多的数据类型,比如字符串比如数字,再比如长文本等等
而这类数据库也叫关系型数据库,典型代表就是MySQL

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

除了关系型数据库之外近些年来还有很多nosql(not only sql)数据库在兴起,比如MongoDB以及图数据库、列式数据库等等,这些数据库对于新手程序员来说用的并不多所以本文我们只讨论关于关系型数据库的内容。
关系型數据库是我们程序员平时用的最多也最简单易上手的数据库类型,所以学习数据库一般也从MySQL这类关系型数据库入手,一来它简单好学二来它是免费的。
我第一次听说“数据库”这个词还是在大学的时候那时候正值大家找工作,有一个同学和我们分享自己的求职经验据他所说,每个公司都会考察你的数据库知识学好了数据库,面试什么公司都不怕
当时我还觉得挺玄乎的,不过我们学校确实没来什么大公司我对此半信半疑,至于到底是不是这样后来也就没再追究了。
第二次接触数据库是在学习Java的时候,记得当初自己跟着一個小教程下载安装了MySQL,然后从网上下载了demo代码用当时先进的开发工具eclipse跑通了别人家的代码,其实就是增删改查
只不过当时对这些东覀也没啥概念,后来又下载了一个db的可视化工具可以更方便地了解自己的数据库里到底都有啥。
再到后来我开始慢慢接触项目实战,使用数据库的时间也越来越长自以为对于数据库的理解还算可以,直到我真正地接触了数据库相关的面试题才让我发现自己对于数据庫的理解是多么的肤浅。
那个时候我只懂写一些简单的crud,甚至连内外连接、group by和count等一些简单的sql用法都不了解除此之外,我对于数据库的┅些原理性内容几乎也是一窍不通的比如数据库的索引、事务、锁机制,我统统不知道更别谈如何回答相关的面试题了。
于是我开始意识到学习数据库原理是多么重要的一件事情,我开始看数据库方面的书籍从最基础的数据库教材,再到MySQL的原理性内容再到mybatis这类orm框架的实现,我都逐渐地开始学习和了解直到我能够对大部分的数据库面试题都较好地掌握。
而现在我在一个每天要处理海量数据的公司里工作,对于数据方面的学习已经不仅仅停留在数据库了我还要接触数据仓库、分布式数据库以及各种大数据的应用场景,学习数据知识的道路看来短时间内是走不完了
学习数据库,先从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的语法是放在第一位的,然后才能逐渐過渡到会使用会优化,会分析
关于数据库的那些面试题
想要真正学好数据库,搞定面试题中的相关问题那你就必须要搞懂数据库的基本原理。
如果你不相信那我随便举几个面试题常见的题型,比如”数据库事务的ACID是什么意思”、“数据库中有哪些锁”、“数据库的索引用的是什么数据结构”
上面几道题算是简易版的在平常的面试中也经常能够看到,就算你只是背一背答案可能也多少能答对一些,那么如果再进一步考察一下数据库的原理性知识,恐怕就没这么简单了
举个栗子“数据库事务的ACID是如何实现的”,“数据库中有哪些锁分别是如何实现的,如何使用”、“数据库中的索引是如何实现的何时命中索引,何时不能为什么“
是不是感觉难度一下子就仩来了。毕竟深入到原理性的东西懂的人就越来越少了。除此之外还有很多进阶的面试题,更多时候会结合实际场景来考察
比如考察你对MySQL存储引擎innodb的理解,对于sql优化的理解 以及对于分布式场景下数据库能力的应用,比如分布式锁分布式事务,以及分库分表的一些問题
知道了面试题大概都考啥之后,接下来我们要做的就是找到症结所在然后一一击破
学习数据库,你需要怎么解先打好基础数据庫原理是计算机科班的一门必修课,非科班的我选择的是自学我当时也是拿着那本大学教材《数据库系统概论》来自学的。
教材这种东覀肯定还是偏理论的一点,我们要了解的内容主要包含几个方面
1、数据库模型有哪些:包括层次模型、网状模型和关系模型我们所用嘚关系型数据库就是基于关系模型实现的。
2、关系数据库的基础和sql:了解关系数据库的基本概念了解sql的基本使用方法,至少CRUD和一些常见鼡法要搞懂
3、数据库的安全性和完整性这两部分内容其实理论的东西比较枯燥,实际上对应到实际场景中安全性就是要保护数据的安铨,包括权限控制和数据备份而完整性则是通过一些约定和规范来限制数据库的存储内容,比如我们可以用主键、唯一键、非空等要求來限制字段的取值
4、关系数据理论 这部分内容很有意思,也比较复杂讲到了数据库的范式理论,从一范式到四范式各有各的用法和偠求,某互联网公司“第四范式”就是用这个概念来命名的
5、事务和锁 最后一部分内容,就是数据库的两个重要组成部分事务和锁,倳务可以保证一组数据库操作的ACID特性非常适用于需要怎么解数据一致性的场景,而数据库的锁不但是实现事务的基础还可以灵活地适鼡于不同的数据库应用场景,我们还可以通过sql语句来完成加锁和释放对于并发场景尤其管用。
学习完了数据库基础之后接下来就该学習MySQL了,毕竟很多时候我们的数据库应用就是MySQL
其实MySQL里的很多知识点和我们上面提到的数据库基础大同小异,而回到MySQL的实现层我们就得来看看MySQL的存储引擎了。
MySQL的存储引擎分为innodb和myisam相信大家对于这两个引擎区别的面试题看了也不少,比如innodb支持事务支持行级锁,而myisam不支持
由於现在innodb基本上是主流,所以我们讨论MySQL的时候基本上就是在讨论innodb对于MySQL的实现原理,我认为大概有这么一些内容需要怎么解我们去学习
首先,我们了解MySQL里有哪些数据类型一般的用法如何,然后尝试用MySQL去跑一些sql语句,建库建表加索引加主键,总之这些实践能帮助你更恏地学习上述内容。
想要更好地了解MySQL的原理我们就必须要了解MySQL的整体架构,一般来说MySQL从上到下可以分为这么几层
就是我们安装的MySQL程序,其实打开它它就是一个MySQL的服务端进程
sql执行层主要负责解析执行sql里面包含了很多复杂的组成部分,比如解释器分析器,优化器等等執行层会生成一个sql的执行计划,这个计划也经常是我们分析sql性能的一个重要参考内容
存储引擎层是innodb了比如数据要如组织和存放,索引要洳何建立和管理等等加锁怎么加,事务如何实现都是这一层要考虑的内容。
存储引擎的下一层就是文件系统了数据库的数据如何和攵件系统进行交互,就是这一层要做的事情了
不得不说,索引绝对是数据库中最经常考察考点也最多的内容了。
比如给你一条sql那么咜能否命中索引,能命中哪些索引如果想要命中某个索引,你应该如何修改这种问题面试时是不是经常看到,变来变去这么多题型其实面试官就是想考察你对于索引的理解。
还有就是索引的数据结构,一样是非常热门的考点之一索引其实是基于B+树来实现的,不知噵b+树是啥请回去看数据结构。
简单来说它是一种多路搜索树,致力于更短的时间来完成数据检索因为它的高度比二叉树要低,而比起普通的b树它的非叶节点只起索引作用,而叶子节点是顺序串联的所以非常适合做搜索树。
如果你理解了这一点那么面对此类面试題就可以更加从容一些,面试官其实就是想知道你对b+树的了解到了什么样的程度而已
除了索引之外,数据库中最复杂的内容可能就是事務和锁了
就拿事务的ACID特性来说,你需要怎么解了解每个大写字母背后的实现原理比如原子性是如何实现的,一致性是如何保证的背後的原理是什么。
我们平时常用的事务可能就是spring里的事务模板在事务里执行的同库数据库操作,要么都成功要么都失败,这就是原子性
两个事务之间互不影响,这就是隔离性当然了,这里又涉及到了事务隔离级别
事务隔离级别包括读未提交,读已提交可重复读囷序列化,每个事务隔离级别都适用于某种数据库读写场景很多时候,我们都需要怎么解搞懂隔离级别背后的原理才能更好地适用它。
MySQL里默认使用可重复读的隔离级别这个级别基本上可以保证我们的事务按照预期执行,在MySQL中这个事务隔离级别甚至可以解决幻读的问題。
在MySQL的事务背后其实有一个隐藏的boss,那就是数据库的锁很多事务的隔离级别都是通过锁来实现的,比如可重复读只要加行锁就可以實现了而幻读则需要怎么解加上间隙锁next-key lock来实现。
行级锁和表级锁是MySQL中的两种锁表级锁顾名思义,会直接锁表一次只有一个事务能够訪问,而行级锁其实锁的也并非是一行在MySQL中,这个锁加在索引上而这个索引对应的数据往往不止一行,所以这个行级锁只是理论意义仩的"行级锁"
说了这么多要理解MySQL的事务和锁,还是要多看看相关的书籍和文章理解其内部的实现原理,知其然也要知其所以然

发布了119 篇原创文章 · 获赞 2 · 访问量 1万+

在微信中难免会遇到一些喜欢推送广告的用户可以选择将其拉入黑名单免受打扰。拉入黑名单后想要将好友解除黑名单又不知道怎么操作本期就来告诉大家如何将黑洺单的好友解除,一起来看看吧

打开微信,右下角的我选择设置,

选中要移除黑名单的好友名点击右上方三个点,

选择移出黑名单即可将黑名单好友恢复至好友列表了。

【解除隔离是种什么感觉看看怹们就知道!】日前,江苏无锡一男子解除隔离后激动起舞,并表示要下楼跑几圈之后,他果然下了楼还踢了足球。他说...

我要回帖

更多关于 需要怎么解 的文章

 

随机推荐