mysql的执行逻辑与日志

mysql的执行整体分为两层
一条sql语句的执行过程如下:
在这里插入图片描述
数据库的连接:mysql -h -p -u -p
show PROCESSLIST 查看我们当前的连接。
长连接:是指我们在连接成功之后,如果客户端持续有请求,则会使用同一个连接。
短连接:是指执行完几次连接之后,就断开了。下次连接,会创建一个新的连接。
连接是一项比较耗用时间的操作,因此需要尽量使用长连接。
mysql执行过程中,临时用的内存是管理在连接对象中的,这些资源只有在连接断开哦之后才能释放,因此,若果有很多长连接会造成内存溢出即OOM。
怎么解决呢?

  1. 定期断开长连接,程序里边可以判断执行一个占用内存较大的查询之后,断开连接。
  2. 2.mysql5.7之后,可以再执行一个较大的查询操作之后,通过执行mysql_reset_connection来重新初始化连接资源,这个过程不需要重连和权限校验,但会讲连接恢复到刚刚创建完时的状态。类似于做了一个清空缓存的操作。
    . 缓存器:查询缓存,不建议使用,因为一旦表发生变动,有这张表有关的缓存都会被清空。mysql8.0之后的版本已经将缓存功能删除。

分析器:类似于java中的编译,检查语句的语法是否正确。
优化器:优化器是在表里有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联的时候,决定表的连接顺序。
执行器

mysql日志:
作用:数据恢复,数据一致性保证
mysql的日志分两块:binlog归档日志,位于server层,记录执行语句,属于逻辑记录。
redolog,inodb特有的,记录数据修改了什么?
redolog是循环写,binlog是追加写。
如何保障数据恢复?binlog日志+全库备份。
场景:今天的下午两天,你删了一张表。这时候你找到上一次的数据库全量备份,正好昨天晚上有。然后你取出昨晚备份时间点之后的binlog日志,依此执行到删表之前,ok。。

如何保证数据一致?
这就要提到两阶段提交。
update a set c=c+1 where id=2;
在这里插入图片描述
这里redolog的prepare和commit两个状态就是两阶段提交。

redolog用于系统重启时数据恢复
binlog用于数据恢复
如果没有两阶段提交,就会造成mysql异常重启后数据与binlog日志记录。
innodb_flush_log_at_trx_commit=1的时候,每次提交事务redo log都直接持久化到磁盘,建议设置为1,这样重启之后数据不会丢失。
sync_binlog=1的时候,每次事务提交binlog都会持久化到磁盘。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41492331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值