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%';