iis网站找不到网页,phpmysql网站开发项目式教程,企业网络拓扑图及说明,安徽网站seo公司客户端先通过连接器建立连接#xff0c;连接器自会判断用户身份#xff1b; 因为这是一条 update 语句#xff0c;所以不需要经过查询缓存#xff0c;但是表上有更新语句#xff0c;是会把整个表的查询缓存清空的#xff0c;所以说查询缓存很鸡肋#xff0c;在 MySQL 8… 客户端先通过连接器建立连接连接器自会判断用户身份 因为这是一条 update 语句所以不需要经过查询缓存但是表上有更新语句是会把整个表的查询缓存清空的所以说查询缓存很鸡肋在 MySQL 8.0 就被移除这个功能了 解析器会通过词法分析识别出关键字 update表名等等构建出语法树接着还会做语法分析判断输入的语句是否符合 MySQL 语法 预处理器会判断表和字段是否存在同时将*替换成所有的列值 优化器确定执行计划因为 where 条件中的 id 是主键索引所以决定要使用 id 这个索引 执行器负责具体执行会调用存储引擎的接口通过主键索引树搜索获取 id 1 这一行记录 如果 id1 这一行所在的数据页本来就在 buffer pool 中就直接返回给执行器更新 如果记录不在 buffer pool将数据页从磁盘读入到 buffer pool返回记录给执行器。 执行器得到聚簇索引记录后会看一下更新前的记录和更新后的记录是否一样 如果一样的话就不进行后续更新流程 如果不一样的话就把更新前的记录和更新后的记录都当作参数传给 InnoDB 层让 InnoDB 真正的执行更新记录的操作 开启事务 InnoDB 层更新记录前首先要记录相应的 undo log因为这是更新操作需要把被更新的列的旧值记下来也就是要生成一条 undo logundo log 会写入 Buffer Pool 中的 Undo 页面不过在内存修改该 Undo 页面的时候也需要将修改的信息保存到 redo log中以便持久化。 InnoDB 层开始更新记录会先更新内存同时标记为脏页然后将记录写到 redo log 里面这个时候更新就算完成了。为了减少磁盘I/O不会立即将脏页写入磁盘后续由后台线程选择一个合适的时机将脏页写入到磁盘比如redolog的持久化文件写满此时mysql会阻塞将脏页数据刷新到磁盘然后清空redolog持久化文件。这就是 WAL 技术MySQL 的写操作并不是立刻写到磁盘上而是先写 redo 日志然后在合适的时间再将修改的行数据写到磁盘上。 至此一条记录更新完了。 在一条更新语句执行完成后然后开始记录该语句对应的 binlogservice层此时记录的 binlog 会被保存到 binlog cache并没有刷新到硬盘上的 binlog 文件在事务提交时才会统一将该事务运行过程中的所有 binlog 刷新到硬盘。 事务提交为了方便说明这里不说组提交的过程只说两阶段提交 prepare 阶段将 redo log 对应的事务状态设置为 prepare然后将 redo log 刷新到硬盘 commit 阶段将 binlog 刷新到磁盘接着调用引擎的提交事务接口将 redo log 状态设置为 commit将事务设置为 commit 状态后刷入到磁盘 redo log 文件 通过上面保证了两个日志文件的一致性数据恢复时读取redolog时如果是prepare状态会拿着里面的XID去binlog中寻找如果不存在说明后续的binlog持久化失败为了保证两者的一致性redolog会回退。 至此一条更新语句执行完成。