一 建立连接
- 想要执行SQL语句当然要先连上数据库,建立连接的过程就是身份认证和权限相关的检验
- 当然,数据库在连接时为了减少创建销魂连接的损耗,引入了连接池的概念,即先建立好几个连接,如果有人需要连接数据库,则直接将这些连接给他们
二 查询缓存
- 每次查询,都会保存SQL语句以及结果集的缓存在内存中
- 下次查询时,会先在缓存中寻找是否有一模一样的SQL语句,如果有的话(命中),就直接将该sql语句对应保存在内存中的结果取出,大大加快了查询时间
- 缓存功能不常用,甚至在8.0版本之后被取消了
三 分析器
- 如果没有命中缓存,则需要分析器分析sql语句
- 分析器就是分析sql语句是不是正确,要做什么操作
四 优化器
五 执行器
六 实例
6.1 查询语句
select name from tb_user U where U.name = "张三" and U.id = 2;
- 先检验是否有权限,若无权限则返回错误
- 8.0版本之前会先找缓存,若没有命中则交给分析器
- 分析器分析一下语法,提取关键元素,例如select,表名tb_user,需要查询的所有列,以及查询条件,然后判断语法是否有错,都没问题就交给优化器
- 优化器自动优化,例如先查id比较好还是先查name比较好,优化器会把认为的最优方案(不一定震的最优)交给执行器
- 执行器执行,若有权限则返回查询到的结果
6.2 update语句
update tb_user U set U.name='李四' where U.id = 2;
- 仍然先判断是否有权限
- 不一样的是,由于update语句设计到更新操作,即IO操作,此时引入了日志模块,日志模块介绍在第七节中。
- 和查询语句一样,得到某行记录后update语句将会更新该条记录并放进内存,把该条修改写入redolog中,将redolog置为prepare状态,再把这条语句写入binlog中,再将redolog置为提交操作
- 自此,更新完成
七 redolog和binlog日志
7.1 区别
- redolog是INNODB引擎中特有的日志模块,而binlog是SQL自带的server层日志模块
- binlog只能做归档
- redolog是物理日志,记录的是某一页修改了什么,binlog是逻辑日志,记录的是语句本身的逻辑
- redolog是固定空间的,可以循环写,binlog是追加写,单个文件达到一定大小会切换到下一个,不会覆盖
7.2 redolog产生的原因
- 听到一个例子比较生动,我们通常所做的修改操作就像酒馆里往账本里记账,例如孔乙己要赊账,那我们要翻开账本,一页一页找到他对应的账目,在酒钱那一栏加一笔,可是如果人多了呢?一下子有十个孔乙己要赊账,你还来的及一页一页找,一页一页记吗?于是我们就需要有一个快速记账的黑板,任何人记账都先写在黑板上,等不忙的时候我再往账本上腾
- 而binlog只是一个归档日志,记录执行了哪些语句
7.3 两阶段提交
- 我们在修改时,首先将修改后的字段存进redolog,将redolog置为prepare,再记入binlog,看看binlog中有没有这么一条修改记录,如果有的话将redolog置为commit,完成更新
- 那为什么不单独用redolog,还需要用binlog,因为我们可能会用机器备份我们的数据,如果备份时选用binlog日志,那么假设一种情况,redolog置为prepare后断电了,如果不进入binlog保存,那么另一个备份在用binlog日志备份的时候就会丢失这一块数据,反之亦然。