首页
学习
活动
专区
圈层
工具
发布

从Mysql架构看一条更新sql的执行过程

上一篇文章我们讲了一条查询sql时如何执行的. 今天我们继续来看下一条更新sql的执行流程. 在数据库里面,我们说的update操作其实包括了更新、插入和删除。...更新流程基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于拿到符合条件的数据之后的操作。...这种情况下可以先把修改记录在内存的缓冲池中,从而提升更新语句(Insert、Delete、Update)的执行速度。 这一块区域就是ChangeBuffer。...在执行 undo 的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,属于逻辑格式的日志。 redo Log 和 undo Log 与事务密切相关,统称为事务日志。...update user set name = 'penyuyan' where id=1; 事务开始,从内存或磁盘取到这条数据,返回给 Server 的执行器; 执行器修改这一行数据的值为 penyuyan

45240
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    php执行svn命令更新代码到服务器

    公司内网更新代码到内网测试服务器,使用的方法是在测试服务器执行svn命令同步开发机器代码,虽然做了定时,但是每次还是要手动更新,觉得太麻烦了, 于是想到用php执行svn命令,这样我们每次用浏览器执行下...php脚本就行了。...,php.ini开启了system函数权限,同样的代码用php命令行可以执行, php -r "system('/usr/local/bin/svn update --force --username...以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。...服务器用的是apache,用户是www,所以用web模块方式运行php用户肯定是www,那么执行svn命令的肯定也是www,所以www需要有更新代码目录的写权限,修改目录权限后, 有下面的警告提示: You

    2.2K20

    MySQL中一条更新的SQL如何执行

    MySQL 之 -- 一条更新的 SQL 如何执行,一条更新的 SQL 语句如何执行执行流程一条 SQL 的执行流程如图所示:(图片来源于网络) 如图所示:MySQL 数据库主要分为两个层级:服务层和存储引擎层服务层...如果通过 key 能够查找到这条 SQL 语句,直接返回 SQL 的执行结果。若存在缓存中,就会继续后面的执行阶段。执行完成后,执行结果就会被放入查询缓存中。优点是效率高。...更新 SQL 语句的日志记录 日志记录用到 WAL 技术,全称为 Write-Ahead-logging 关键点为:先写日志,再写磁盘 redo log redo log 是 InnoDB 引擎 中的日志模块...redo log 与 binlog 执行顺序,和重要的两步提交 更新流程如图所示:红色为在执行器中执行,蓝色在 InnoDB 内部执行 update 语句执行时的内部流程。...引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。

    1.4K10

    MySQL中一条更新的SQL如何执行

    MySQL 之 -- 一条更新的 SQL 如何执行,一条更新的 SQL 语句如何执行执行流程一条 SQL 的执行流程如图所示:(图片来源于网络) 如图所示:MySQL 数据库主要分为两个层级:服务层和存储引擎层服务层...如果通过 key 能够查找到这条 SQL 语句,直接返回 SQL 的执行结果。若存在缓存中,就会继续后面的执行阶段。执行完成后,执行结果就会被放入查询缓存中。优点是效率高。...更新 SQL 语句的日志记录 日志记录用到 WAL 技术,全称为 Write-Ahead-logging 关键点为:先写日志,再写磁盘 redo log redo log 是 InnoDB 引擎 中的日志模块...redo log 与 binlog 执行顺序,和重要的两步提交 更新流程如图所示:红色为在执行器中执行,蓝色在 InnoDB 内部执行 update 语句执行时的内部流程。...引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。

    1.1K10

    PHP获取MySQL执行sql语句的查询时间方法

    如下所示: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($...的执行时间进行分析可以: 1,确定sql的书写是否合理,高效 2,检查字段、表的设计是否合理 方法1:在系统底层对sql操作类进行改写,通常类的结构是 业务model ---》 db类 ---》 执行sql...这个更适合统计多条sql的执行情况。 我见过好像是一个博客,访问页面之后会有一个提示大概说共查询了几次数据库,用了多长时间查询数据,那么开启mysql的profile就可以轻松实现了。...引用2:PHP获取毫秒级时间戳的方法 java里面可以通过gettime();获取。如果是要与java写的某些程序进行高精度的毫秒级的对接通信,则需要使用PHP输出毫秒级的时间。...执行sql语句的查询时间方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

    6.7K00

    一条更新SQL是如何执行的

    通过上面的描述,我们知道一条查询SQL执行的主要过程,客户端执行一条SQL前需要先经过连接数据库、解析器、优化器、执行器等阶段,再由执行器返回查询结果,具体过程可以参考下面的简图。...查询SQL是对已有数据的访问和返回,一般情况下不会涉及到数据存储的更新,那么有数据更新的场景是怎么执行的呢?...+2 where id1=156; 对于一条更新SQL来说,它和查询SQL一样要经过SQL解析、优化、执行等阶段,同时会多出来写WAL(Write Ahead Logging)日志的步骤。...顾名思义,数据库在执行更新操作前先写日志,后写数据。...以上面的UPDATE操作为例,执行器从存储读入ID1=156的数据到内存中,并在内存中做ID2+2计算,完成计算后并不马上把这条记录刷新到硬盘,而是先记录一条日志,就告诉客户端这个操作已经完成,继续处理其他任务

    65641

    一条更新sql的完整执行流程(超详细)

    一条查询sql的完整执行流程(从连接到引擎,穿插涉及到的知识,超详细) 在数据库里面,我们说的update操作其实包括了更新、插入和删除。...更新流程和查询流程有什么不同呢? 取到数据前和查询的基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。 区别就在于拿到符合条件的数据之后的操作。...但是,要学习更新的执行流程,我们需要先知道以下几个名词的含义: 贴图镇此博客( ) 缓冲池 Buffer Pool   首先,对于InnoDB存储引擎来说,数据都是放在磁盘上的,存储引擎要操作数据...binlog的另一个功能就是用来实现主从复制,它的原理就是从服务器读取主服务器 的binlog,然后执行一遍。...3、 执行器收到通知后记录binlog,然后调用存储引擎接口,设置redolog为 commit 状态。 4、 更新完成。 这张图片的重点: 1、 先记录到内存,再写日志文件。

    59140

    一条SQL更新语句是如何执行的?

    这是图解MySQL的第2篇文章,这篇文章会通过一条SQL更新语句的执行流程让大家清楚地明白: 什么是InnoDB页?缓存页又是什么?为什么这么设计? 什么是表空间?...---- 之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢?...SQL更新语句的执行总结——初版 有了事务日志之后,我们来简单总结一下更新操作的流程,这是一个简化的过程。 name 原值是chanmufeng。...加上两阶段提交之后我们再来看一下SQL更新语句的执行流程。 7....SQL更新语句的执行总结——终版 客户端发送更新命令到MySQL服务器,经过处理连接、解析优化等步骤; Server层向InnoDB存储引擎要id=1的这条记录; 存储引擎先从缓存中查找这条记录,有的话直接返回

    71320

    MySQL架构(二)SQL 更新语句是如何执行的?

    那么在这篇文章中,小鱼将介绍更新语句的执行流程,从中我们又能学到什么呢? SQL 的更新流程 我们先创建一张表作为演示表,作为演示表只需要一个主键、一个额外字段就可以了。...下面是演示表的创建语句: CREATE TABLE test(ID int primary key, age int); 如果我们需要将 ID=2 目标值自增 1,更新的 SQL 语句如下。...UPDATE test SET age=age+1 WHERE ID=2; 更新目标值时,得先查找的该行数据,所以也会执行SQL查询语句的流程。 在执行语句前,连接上数据库(连接器)。...最后,执行器负责更新的具体执行,根据索引找到目标行,再执行更新。 执行器会先找引擎取出 ID=2 的行数据。因为 ID 是主键索引,引擎直接用索引树搜索找到目标行数据。...写 redo log 的流程如下: 先将目标原始数据从磁盘中读入内存中来,修改数据的内存拷贝。 生成一条重做日志并写入 Redo Log Buffer,记录的是数据被修改后的值。

    44310

    SQL优化案例-从执行计划定位SQL问题(三)

    当SQL出现问题,能从执行计划中快速的定位哪部分出现问题很重要,SQL文本如下(为保证客户隐私,已经将注释和文字部分去掉): SELECT /*+ index(i IDX_INVM_BEC)*/ RQ,...: 可以一眼定位到view部分导致整个执行缓慢,那么我们仔细分析下view部分是怎么执行的。...行数据,查看ID18谓词信息 18 - filter(("SJJGM"='1700' OR "JGM"='1700')) 从这部分再回到SQL文本寻找SQL代码是AND I.BRANCH_NO IN (...那么就很好办了,ID4和ID15应该走hash join,查看outline data信息,还没办法使用db_name信息引导执行计划走hash join,那么只能改写SQL。...由13分钟变为5秒钟执行完,看ID19还要执行999k次,查询ID18谓词信息对应SQL如下,确实是要返回999k行数据。

    50060

    无法成功执行catalog.sql,ORA-04045 ORA-04064

    最近同事报料,数据库无法执行一些关于数据字典的查询。即使是查询dba_users都会出现错误。从错误日志来看,全部是数据字典的一些错误信息,而用户数据还是ok的。...那就执行catalog.sql吧。晕,竟然连执行这个SQL语句都报错!数据没有备份呢,汗!!! 如果你也是无法成功执行catalog.sql,接着往下看。...--从前面的错误描述来看及所发生的对象来看,系统用户LBACSYS这个对象错误了,为无效对象 --尝试重新编译,问题依旧 --下面直接执行catalog,执行时其日志文件出现大量的错误提示。...也就是说无法重建数据字典 --尝试了使用restirct 方式来重启DB后执行,依旧出现相同的错误 SQL> @?...SQL> @catproc.sql 6.

    1.4K30

    笔记 | 一条SQL更新语句是如何执行的?

    write pos 和 checkpoint 之间:是“粉板”上还空着的部分,可以用来记录新的操作write pos 追上 checkpoint:表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录...redo log 是 InnoDB 引擎特有的日志重要的日志模块:binlog(归档日志)【更新流程】mysql> update T set c=c+1 where ID=2;执行器先找引擎取 ID=2...引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。...执行器生成这个操作的 binlog,并把 binlog 写入磁盘。执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。...innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘bingo是server层特有的日志Binlog有两种模式,statement 格式的话是记sql

    84400

    MySQL实战 -- 一条SQL更新语句是如何执行的?

    ; 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写: mysql> update T set c=c+1 where ID=2; 前面我有跟你介绍过 SQL 语句基本的执行链路,这里我再把那张图拿过来...接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器负责具体执行,找到这一行,然后更新。...这个时候掌柜只好放下手中的活儿,把粉板中的一部分赊账记录更新到账本中,然后把这些记录从粉板上擦掉,为记新账腾出空间。...(3)引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。...(4)执行器生成这个操作的 binlog,并把 binlog 写入磁盘。 (5)执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

    96430

    面试官:你说说一条更新SQL的执行过程?

    在上一篇《面试官:你说说一条查询SQL的执行过程?》中描述了Mysql的架构分层,通过解析器、优化器和执行引擎完成一条SQL查询的过程,那这一篇续上继续说明一条更新SQL的执行过程。...对于一个SQL语句的更新来说,前面的流程都可以说类似的,通过解析器进行语法分析,优化器优化,执行引擎去执行,这个都没有什么问题,重点在于多了一点东西,那就是redo_log、undo_log和binlog...执行流程大致如下: 首先客户端发送请求到服务端,建立连接。 服务端先看下查询缓存,对于更新某张表的SQL,该表的所有查询缓存都失效。...然后优化器进行SQL优化,比如怎么选择索引之类,然后生成执行计划。 执行引擎去存储引擎查询需要更新的数据。 存储引擎判断当前缓冲池中是否存在需要更新的数据,存在就直接返回,否则去从磁盘加载数据。...按照上述流程来举例的话,比如update user set age=20 where id=1这样的简单更新SQL,我们不管执行引擎怎么拿到的数据,不管是从缓冲池拿的还是磁盘拿到的,这条现在数据都在缓冲池里面

    48030

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

    ); 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写: mysql> update T set c=c+1 where ID=2; 前面我有跟你介绍过 SQL 语句基本的执行链路。...SQL更新与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)。...然后切换到内核态的线程执行,就需要把线程的私有信息从寄存器,程序计数器里读出来,然后执行读磁盘上的数据。读完后返回,又要把线程的信息写进寄存器和程序计数器。...--来自《Linux性能优化实战》里的知识 SQL执行前优化器对SQL进行优化,这个过程还需要占用CPU资源 redo log 里用的技术就是MySQL 里经常说到的 WAL 技术,WAL 的全称是...有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前的记录和更新后的记录。

    57920
    领券