《吊打面试官》系列-数据库基础知识

https://mp.weixin.qq.com/s/NDL1Q6nqdPq5oMBWSpq4ug

《吊打面试官》系列-数据库基础知识

收录于话题#程序员 1568 #数据库 642mysql

前言

数据库我想你们应该一点都不陌生吧,我想无论你写啥的,数据库就算没用过也听过了,是咱们项目体系里面不可或缺的一环。程序员

问了一圈,身边朋友公司要么用自研,要么就清一色的MySQL,因此想看Oracle的朋友可能要失望了,可是不影响你了解数据库的通用知识。面试

正文

你知道MySQL的基本架构么?你能在纸上给我大体画出这个示意图么?sql

image.png

好的那咱们按照顺序了解下,链接器是啥?数据库

咱们要进行查询,第一步就是先去连接数据库,那这个时候就是链接器跟咱们对接。缓存

他负责跟客户端创建连接、获取权限、维持和管理链接。微信

连接的时候会通过TCP握手,而后身份验证,而后咱们输入用户名密码就行了。session

验证ok后,咱们就连上了这个MySQL服务了,可是这个时候咱们处于空闲状态。架构

怎么查看空闲链接列表?框架

show processlist,下图就是我在本身的数据库表执行命令的结果,其中的Command列显示为Sleep的这一行,就表示如今系统里面有一个空闲链接。

image.png

这里须要注意的是,咱们数据库的客户端过久没响应,链接器就会自动断开了,这个时间参数是wait_timeout控制住的,默认时长为8小时。

断开后重连的时候会报错,若是你想再继续操做,你就须要重连了。

这个有个我看过的书本的案例:

一个在政府里的朋友说,他们的系统很奇怪,天天早上都得重启一下应用程序,不然就提示链接数据库失败,他们都不知道该怎么办。


按照这个错误提示,应该就是链接时间过长了,断开了链接。

数据库默认的超时时间是8小时,而他们平时六点下班,下班以后系统就没有人用了,等到次日早上九点甚至十点才上班,这中间的时间已经超过10个小时了,数据库的链接确定就会断开了。

是的,就是超出了超时时间,而后写代码的人也没注意到这个细节,因此才会出现这个问题。

把超时时间改得长一点,问题就解决了。

这种参数其实咱们平时不必定能接触到,可是真的遇到问题的时候,知道每一个参数的大概用法,不至于让你变成无头苍蝇。

那除了从新连接,还有别的方式么?由于创建连接仍是比较麻烦的。

使用长链接。

可是这里有个缺点,使用长链接以后,内存会飙得很快,咱们知道MySQL在执行过程当中临时使用的内存是管理在链接对象里面的。

只有在连接断开的时候才能获得释放,那若是一直使用长链接,那就会致使OOM(Out Of Memory),会致使MySQL重启,在JVM里面就会致使频繁的Full GC。

那你会怎么解决?

我通常会按期断开长链接,使用一段时间后,或者程序里面判断执行过一个占用内存比较大的查询后就断开链接,须要的时候重连就行了。

还有别的方法么?你这种感受不优雅呀小老弟。

执行比较大的一个查询后,执行mysql_reset_connection能够从新初始化链接资源。这个过程相比上面一种会好点,不须要重连,可是会初始化链接的状态。

你了解MySQL的查询缓存么?

MySQL拿到一个查询请求后,会先到查询缓存看看,以前是否是执行过这条语句。

你们是否是好奇同一条语句在MySQL执行两次,第一次和后面的时间是不同的,后者明显快一些,这就是由于缓存的存在。

他跟Redis同样,只要是你以前执行过的语句,都会在内存里面用key-value形式存储着。

查询的时候就会拿着语句先去缓存中查询,若是可以命中就返回缓存的value,若是不命中就执行后面的阶段。

可是我仍是不喜欢用缓存,由于缓存弊大于利。

哦?此话怎讲?

缓存的失效很容易,只要对表有任何的更新,这个表的全部查询缓存就会所有被清空,就会出现缓存还没使用,就直接被清空了,或者积累了不少缓存准备用来着,可是一个更新打回原形。

这就致使查询的命中率低的可怕,只有那种只查询不更新的表适用缓存,可是这样的表每每不多存在,通常都是什么配置表之类的。

那咱们查询的时候不想用缓存通常都是怎么操做的,或者是用缓存又怎么操做?

能够显示调用,把query_cache_type设置成为DEMAND,这样SQL默认不适用缓存,想用缓存就用SQL_CACHE。

有个小技巧就是,咱们以前开发的时候,都会去库里看看sql执行时间,可是多是有缓存的,通常咱们就在sql前面使用SQL_NO_CACHE就能够知道真正的查询时间了。

 select SQL_NO_CACHE * from B

缓存在MySQL8.0以后就取消了,因此你们如今应该不须要太关注这个问题,主要是我以前用的版本都不高,因此缓存一直有,在《高性能MySQL》书中也看到了一些关于缓存的介绍,就想起来给你们也提一下了。

缓存查询完了应该作啥呢?

在缓存没有命中的状况下,就开始执行语句了,你写的语句有没有语法错误,这是接下来MySQL比较关心的点。

那他会怎么作呢?会先作词法分析,你的语句有这么多单词、空格,MySQL就须要识别每一个字符串所表明的是什么,是关键字,仍是表名,仍是列名等等。

而后就开始语法分析,根据词法分析的结果,语法分析会判断你sql的对错,错了会提醒你的,而且会提示你哪里错了。

image.png

分析没错以后就进入下一步,优化器

主要是优化什么呢?

优化就比较简单了,由于咱们创建表可能会创建不少索引,优化有一步就是要确认使用哪一个索引,好比使用你的主键索引,联合索引仍是什么索引更好。

还有就是对执行顺序进行优化,条件那么多,先查哪一个表,仍是先关联,会出现不少方案,最后由优化器决定选用哪一种方案。

最后就是执行了,执行就交给执行器去作。

第一步可能就是权限的判断,其实这里我不肯定的一个点就是,我接触的公司不少都是自研的线上查询系统,咱们是不能用Navicat直连线上库,只能去网页操做,那表的权限是在MySQL层作的,仍是系统作的,我猜应该是系统层作的,MySQL可能默认就全开放了,只是咱们 不知道ip。

有知道的小伙伴也能够在公众号【三太子敖丙】去加我微信跟我说。

执行的时候,就一行一行的去判断是否知足条件,有索引的执行起来可能就好点,一行行的判断就像是接口都提早在引擎定义好了,因此他比较快。

数据库的慢日志有个rows_examined字段,扫描多少行能够看到,还有explain也能够看到执行计划,咱们扫描了多少行。

能够小伙子,基础大体框架仍是了解得很清楚的,咱们下次深刻了解下,索引和部分机制。

好的,咱们下次见。

总结

基本上我把MySQL的逻辑架构的东西都简单聊了一遍,固然你去自信了解的话,你会发现其实里面还有不少细节的,我只是说了一些常见的问题,这仍是阿里丁奇学长的《MySQL实战》的思路。

我本身在MySQL方面更多的可能就是理论知识了,还作不到深刻了解的地步,你们若是有机会必定要深刻的去学习一下。

絮叨

这应该是我开年的第一篇技术文,原本年前写了一点索引的东西,可是后面在构思的时候想了想,仍是从数据库的基础知识跟你们熟悉起来,再去了解索引会好点。

新年可能会尝试一些新的文章风格,不必定所有用面试的方式,固然这篇是面试的风格,由于新的风格还没决定。我还会尝试着在4月份之后开始以视频录制这样的方式尝试几期,你们有什么意见也能够在微信上跟我说。

之后絮叨我也放最后,这样你们阅读体验好点,反正有啥直接跟我反馈,宠粉的我,纷纷安排。

你们最近必定穿好衣服不要感冒啥的,鸡蛋去看个病,差点吓尿了,给大家看看他的装备:

image.png

笑死我了,咱们下篇文章见。

很久没开赞扬了,之后一个月只开一两次,固定收租哈哈。


三太子敖丙

你知道的越多,你不知道的越多

赞扬二维码喜欢做者

相关文章
相关标签/搜索