当前位置: 首页 > article >正文

Mysql update更新数据执行流程

update 的执行流程是以select查询为基础执行的!!你不明白select执行流程?没关系,这篇博客照样让你明白,update执行流程!

存储引擎是什么?

如果把数据库比作一个大仓库,那么存储引擎就是仓库的管理员

其主要职责:

1.存数据

决定数据以什么格式存在硬盘上(就像文件可以存txt、pdf、word不同格式)

2取数据

当你要查询时,决定怎么最快找到数据(就像有的管理员用分类标签,有的用条形码)

3.管事务

保证数据操作的安全(就像仓库进出货要登记,不能出错)

想要修改数据,首先要通过存储引擎层读取数据,把数据读取到服务层进行修改,在通过存储引层把数据传到数据库中

mysql每次读取16384个字节的数据 ,默认是16kb的数据,一页的数据。就像cpu与磁盘之间为什么会有内存一样,存储引擎与磁盘之间有一个buffer pool,引擎会从bufferpool中获取数据然后修改,再把修改的数据写道bufferpool中,然后bufferpool再传到数据库中!

流程是这样的:

好了,我们现在从bufferpool中读取到了数据,并对数据做了修改,存回到了bufferpool中,那数据从bufferpool到磁盘是怎么工作的?

1.要认识一个词语:脏数据。

只要是存储在bufferpool中的,还没有同步到磁盘中的数据称为脏数据

那我们最终目的就是把这些脏数据同步到磁盘中

2.刷脏机制(重要)

(1)当innodb中的脏页比例超过innodb_max_dirty_pages_pct_lwm的值时,这个时候innodb就会开始刷新脏页到磁盘

脏页比例?一个bufferpool的大小为128MB 上面说了,读取一页的数据大小为16KB,自脏页比例就很好理解啦!

(2)当innodb中的脏页比例超过innodb_max_dirty_pages_pct_lwm的值,而且还超过

innodb_max_dirty_pages_pct时,innodb就会进入勤快刷新模式,在这个模式下啊innodb会把脏页更快的刷新到磁盘中

(3)还有一种情况叫做sharp checkpoint ,当innodb要重用它之前的redo文件时,就会把innodb_buffer_pool中所有与这个文件有关的页面都要刷新到磁盘;这样做就有可能引起磁盘的IO风暴了,轻者影响性能,重者影响可用性。(redo文件???)

(4)innodb_max_dirty_pages_pct默认值为75,也就是说当脏页比例超过75%时才会进入勤快刷新模式。

innodb_max_dirty_pages_pct_lwm默认值是0,0对于innodb_max_dirty_pages_pct_lwm来说是一个特殊值,它表示不启用这个功能;由于没有启用这个功能,也就是说innodb_buffer_pool中的脏页比例会操持在75%左右。

当然啦,因"库"而吧是😁😁😁😁😁😁😁😁😁

好了大致流程就是这样那么,现在我们追求探讨关于数据安全的问题

1.如果数据从bufferpool传到磁盘的过程中,突然停电了,服务器挂掉了,导致修改的数据丢失该怎么办?

2.如果你想改名字为”张三“,却误改为”李四“怎么办?

解决第一个问题要使用redo log日志,其实就可以理解为一份备用数据,目的就是恢复崩溃的数据,所以在数据进行刷脏之前必须要先写入redo log日志

 

问题:数据没有直接存入到磁盘上,而是先存入到buffer pool中,然后再刷入磁盘,目的是为了性能考虑,但是现在有需要存入到redo log 日志的磁盘文件中,这样性能不就下降了?

答案:性能肯定是会有一些影响,但是需要保证数据可恢复的能力。写入redo log磁盘文件中的速度会更快一些。

随机磁盘IO和顺序磁盘IO的区别。

随机磁盘IO的情况是数据是会分散到不同的扇区去存储,因为底层是通过索引的顺序来存储,索引会存储到不同的扇区。那么更新数据的时候会增加寻道的时间,写入数据会变慢。

顺序磁盘IO是按着顺序追加写入的。

这是redo log 日志的位置:

解决第二个问题,无非就是进行一次撤回操作嘛,如何进行撤回操作呢,首先你得保存之间所做的操作:用undo log日志保存 

undo log可以称为撤销日志或者回滚日志,站在事务的角度,undo log可以保证事务的原子性。

日志中记录的反向操作,例如:把username=”张三” 修改成了username=”赵四”,那么undo log中记录的是原来的值,即 username=”张三” 这样数据库再发生回滚操作的时候,可以把数据恢复回来。

通过命令查看相关的信息。

show VARIABLES like'%undo%';

undo log位置:

 bin log 日志:

binary log 二进制日志,属于mysql服务层的日志。

binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。

binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。

主要作用是主从复制和数据恢复的作用。

特点:

记录DDL和DML的语句,属于逻辑日志

没有固定大小限制,内容可以追加

Server层实现,可以被所有存储引擎使用

用于数据恢复和主从复制

可以使用命令查看

show GLOBAL VARIABLES like'%log_bin%';

最后用流程图来总结一下update执行流程吧!!! 


http://www.kler.cn/a/611475.html

相关文章:

  • Maven工具学习使用(四)——仓库
  • 智能科技与美学融合,赵伟辰荣膺 2025 iF 设计大奖
  • 量化研究--小果聚宽交易系统上线高速服务器,提供源代码
  • C#从入门到精通(2)
  • Java在2025年的新趋势与应用
  • 【MVCC快照如何实现】
  • 【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
  • MongoDB 与 Elasticsearch 使用场景区别及示例
  • STL之string
  • 鸿蒙 一多适配/屏幕适配/设备适配/分栏
  • Java共享自习室系统全方位技术解析与实战搭建指南
  • C++:函数(通识版)
  • Ansys Zemax | 联合Speos实现供应商与OEM交换黑盒光学系统
  • AI编程工具-(九)
  • 双指针---《移动零》
  • 洛谷题单1-B2002 Hello,World!-python-流程图重构
  • Linux一步部署主DNS服务器
  • 音视频新人如何快速上手nginx-rtmp-module
  • 【C++指针】搭建起程序与内存深度交互的桥梁(上)
  • 美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万