mysql基础架构

mysql基础架构

在这里插入图片描述
MySQL可以分为server层和存储引擎层两部分。
Server层为图中上面绿框的部分。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持innodb、MyISAM、Memory等
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
我们可以通过show processlist查看此时建立的连接。在这里插入图片描述
sleep代表此时系统有一个空闲的连接。如果客户端太长时间没动静,连接器就会自动断开,时间由wait_timeout控制。
数据库里,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询之后就断开连接了,下次查询再重新建立。
使用长连接后你可能会发现有些时候MySQL内存涨的特别快,这是因为这是因为MySQL在执行过程中使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放。所以长连接累积下来可能会导致内存占用过大。
怎么解决这个问题呢?你可以考虑以下两种方案。
1.定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
2.如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存
由于缓存的失效性非常频繁,就会导致因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。所以mysql在8.0的时候,把查询缓存的功能彻底删除了。

优化器

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

例如以上语句
既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。
也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

执行器
你可以在数据库的慢查询日志中看到一个rows_examined字段,表示这个语句在执行过程中扫描了多少行。这个值是在执行器每次调用引擎获取数据行的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。

日志系统:一条SQL更新语句是如何执行的?

与查询流程不一样的地方是更新流程还涉及两个重要的日志模块:redo log(重做日志) 和 binlog(归档日志)。
redo log
当有一条记录需要更新的时候,Innodb就会先把记录写入到redo log中,然后更新内存,这时候更新操作就算完成了。同时,Innodb引擎会在适当的时候将这个操作更新到磁盘中。
redo log是循环写入的。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。在这里插入图片描述
有了redo log就可以保证即使数据库发生异常重启,之前提交的数据也不会丢失,这个能力叫做crash-safe。

binlog
redo log是Innodb引擎特有的日志,而server层的日志就是binlog。
redo log和binlog的三点区别:
1.redo log是innodb引擎特有的,而binlog是server层实现的,所有引擎共有/
2.redo log是物理日志,记录的是“在某个数据页上做了什么修改”。而binlog是逻辑日志,记录的是语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
3.redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

执行器和Innodb引擎在执行简单更新语句的流程:
1.执行器先引擎取到id=2这一行,由于id是主键,所以会直接通过树搜索找到这一行。如果id=2所在的数据页本身就在内存中就直接返回给执行器,否则,需要磁盘读入内存,然后再返回。
2.执行器拿到引擎给的行数据,就把这个行数据的值+1,得到新的一行数据,再调用引擎接口写入这行新数据。
3.引擎将这行新数据更新到内存中,同时将更新操作记录到redo log中,此时redo log处于prepare状态,然后告知执行器执行完成了,随时可以提交事务。
4.执行器生成这个操作的binlog,并把binlog写入磁盘。
5.执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成commit状态,更新完成。

上述流程可以看到数据的修改操作是由执行器完成的,而实际将修改后的数据写回指定位置是由引擎完成的。

在这里插入图片描述
你可能注意到了,最后三步看上去有点“绕”,将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。
这是为了让两个日志之间的逻辑保持一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值