天天看点

面试官:关于数据库MySQL说说你的理解吧

文章目录

1. mysql体系结构

2. 我们再来看看query cache

万万没想到

面试前戏

面试开始

后续

万万没想到,一个运维去面试,面的全是数据库,因为在面试官心里运维应该对数据库很熟。

的确是对数据库很熟, 那为什么还回答的不好? 主要是因为给的工资少,如果给多点,能更熟。

没有很熟,只有更熟!

万万没想到,一个运维去面试,不问体系架构,只问增删改查,只问事务和存储过程,他们希望一个运维,最好把dba的活给干了,但不给dba的工资。

开发小张正在拼命的写着bug,时而停下喝一口冒着热气的咖啡,鬼知道是第几杯,只见小张运指如飞,屏幕上满是 “小bug蹲,小bug蹲,小bug蹲完了大bug蹲”;

一阵铜铃般的笑声传来,惊得小张差点把刚入口的咖啡喷到屏幕上, 真的是未见其人先闻其声,身后传来hr小王的声音“快点小张,来面试的了,面运维你去看看。”

“bug”小王愤愤的说,代码都写不完了,天天给你面试,还是面的运维,他会数据库吗?

拿着hr扔过来的简历,快步走向会客室。

话说会客室这位,也是3年运维经验的小刘,正正襟危坐,等候技术面试官的到来。

小张招呼小刘做下,问了几个数据库的问题

数据库你们都用过哪些?

数据库删除有两种方式,这两种方式的区别?

小刘都一一回答了,这时小张想故意为难下面试者,就抛出了一个问题,说说你对数据库的理解吧? 问完之后,小张得意的看着面试者,心想“这下看你咋回答”

小刘毕竟是老运维,看着面试官得意的微笑,心里不由的一紧,又故作镇静的回答到:

关于mysql的理解,我们先来说说mysql的体系结构:

mysql的体系结构可以分成3个部分,分别是:

mysql-client: 比如一个命令行,或者使用java的jdbc发送sql语句

mysql-server: 分为5个部分

连接器 (管理连接权限认证)

查询缓存 (命中则缓存起来)

分析器 (词法 语法分析)

优化器 (执行计划生成,索引选择)

执行器(操作,返回结果)

mysql-存储引擎: 负责存储数据,提供读写接口(建表的时候指定myisam,innodb , memory)

这里祭出mysql官网的体系架构图:

面试官:关于数据库MySQL说说你的理解吧

应用程序通过接口(如:odbc,jdbc)来连接mysql,最先连接处理的是连接层,连接层包括通信协议,线程处理,用户名密码认证等三个部分。

通信协议负责检测客户端版本是否兼容mysql客户端。

线程处理是指每一个连接请求都会分配一个对应的线程。 相当于一条sql对应一个线程, 一个线程对应一个- 逻辑cpu,并会在多个逻辑cpu之间进行切换。

用户名密码认证创建账号和密码,以及host主机授权是否可以连接到mysql服务器。

sql层包含权限判断,查询缓存,解析器,预处理,查询优化器,缓存和执行计划。

权限判断可以审核用户有没有访问某个库,表,或者表里的行的权限。

查询缓存是通过query cache进行操作,如果数据在query cache中,则直接返回结果给客户端。

查询解析器是对sql语句进行解析,判断语法是否正确。

预处理器对解析器无法解析的语句进行处理。

优化器对sql进行改写和相应的优化,并生成最优的执行计划,通过调用程序api接口,通过存储引擎层进行数据的访问

存储引擎层也是mysql数据库区别与其他数据库很重要的一点。

刚刚我们说到query cache中有数据就直接返回给客户端,但在生产中,这一项建议关闭。 因为他只能缓存静态数据信息,一旦数据发生变化,比如经常读写,这个参数开启就没有任何的意义。

在mysql5.6之前是默认开启的,mysql5.6之后则是默认关闭的。在mysql8之后的版本中直接给删除了

一般开启为on, 关闭为off , 在mysql8中直接为no, 已经不再需要这个缓存参数了

小刘滔滔不绝的把mysql的体系架构说完了,然后又说了下mysql的运维架构体系和备份方法。

面试官一看这也难不住他啊,于是作罢,起身送客

预知后事如何,我们下回再见。

继续阅读