java面试一日一题:请讲下对mysql的理解
问题:请讲下对mysql的理解
分析:该问题主要考察对mysql的理解,基本概念及sql的执行流程
回答要点:
主要从以下几点去考虑,
1、mysql的整体架构?
2、mysql中每一个组件的作用?
3、对mysql的自己的见解?
从网上拷贝一张图,来说明mysql的整体架构
个人认为这张图画的很好,
连接器
一条sql经过网络传输到达mysql服务器,第一个要经过的就是连接器,负责连接的建立及权限的判定,例如经常看到的下面的错误,
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
该错误就是经过连接器的处理,密码不正确而返回的。
查询缓存
查询缓存,刚接触mysql的可能有疑惑,mysql怎么会有查询缓存,其实mysql就和平时开发的后端系统是一样的,它也是一个系统,平时如果一个查询较多的系统,发现查询慢了,经常采取的一种方式就是增加一个缓存吧,这里也是一样的,只不过这里mysql已经为我们做好了,就是来存储查询到的数据,缓存key是sql语句,缓存值是查询到的结果,关于查询缓存的具体介绍可以参照下方的链接:https://www.cnblogs.com/coshaho/p/7192343.html
分析器
分析器说的通俗点就是客户端发送来的一条sql,分析要分析这条sql是否正确,是否符合sql的语法,如果不符合就直接返回报错了。
优化器
经过了分析器处理的sql这时就是一条可执行的sql,但是mysql本身内置了一系列的逻辑,就是它会用它认为执行效率最高的方式去执行,并且生成执行计划(可通过explain sql语句查看),包括如何选择索引,是否会涉及全表扫描;
执行器
执行器就是真正执行sql的组件,并且把执行的结果返回
上面提到的几大组件,统一属于server层,server层之下是存储引擎层,mysql的存储引擎常见的有myIsam、innodb,不同的引擎对应的server层是一致的,也就是server层提供了引擎层的统一抽象和实现。为什么要有不同的存储引擎,是因为在不同的场景下数据的存储形式可以是不一样的,myIsam这个引擎实现的就是适合查询频率高的场景,不支持事务;innodb这个引擎实现的是支持事务。也就是说不同的场景决定了不同的引擎,所以在建数据表的时候经常会让我们指定使用的数据引擎,细心的同学可以留意下。
说完了mysql的整体架构,想说下mysql中常见的日志是怎么实现的,
binlog,做过mysql的都知道,在mysql中有binlog也叫做二进制日志,用来记录mysql中的更新操作,可用来进行数据的恢复,既然是记录mysql的更新操作,那么它就属于server层
redo log和undo log,了解事务的都知道redo log和undo log是用来支持事务的,在常用的myIsam和innodb引擎中,innodb是支持事务的,那么redo log和undo log应该是在引擎层产生的;