SQL语句在MYSQL中如何执行

一 建立连接

  • 想要执行SQL语句当然要先连上数据库,建立连接的过程就是身份认证和权限相关的检验
  • 当然,数据库在连接时为了减少创建销魂连接的损耗,引入了连接池的概念,即先建立好几个连接,如果有人需要连接数据库,则直接将这些连接给他们

二 查询缓存

  • 每次查询,都会保存SQL语句以及结果集的缓存在内存中
  • 下次查询时,会先在缓存中寻找是否有一模一样的SQL语句,如果有的话(命中),就直接将该sql语句对应保存在内存中的结果取出,大大加快了查询时间
  • 缓存功能不常用,甚至在8.0版本之后被取消了

三 分析器

  • 如果没有命中缓存,则需要分析器分析sql语句
  • 分析器就是分析sql语句是不是正确,要做什么操作

四 优化器

  • 优化器就是让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日志备份的时候就会丢失这一块数据,反之亦然。

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/123746534