MySQL UPDATE执行顺序揭秘

资源类型:11-8.net 2025-06-24 06:18

mysql的update执行顺序简介:



MySQL的UPDATE执行顺序深度解析 在MySQL数据库中,UPDATE语句用于修改表中的现有数据

    了解其执行顺序和背后的机制,对于数据库管理员和开发人员来说至关重要

    本文将深入探讨MySQL中UPDATE语句的执行顺序,包括从客户端请求到数据存储的整个过程,以及涉及的各类日志和缓冲区的作用

     一、UPDATE语句的基本结构 首先,我们需要了解UPDATE语句的基本语法结构

    一个典型的UPDATE语句如下: sql UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2, ... WHERE 条件; 例如,假设有一个名为students的表,包含id、name和age列

    要更新id为1的学生的姓名和年龄,可以使用以下语句: sql UPDATE students SET name = 张三, age =20 WHERE id =1; 在这条语句中,UPDATE关键字指定了要执行的操作类型,表名指定了要更新的表,SET关键字后跟要更新的列和新值,而WHERE子句则用于指定更新条件,以避免更新所有行

     二、UPDATE语句的执行顺序 MySQL的UPDATE语句执行涉及多个层次和组件,包括客户端、服务器层(Server层)和存储引擎层

    下面将详细阐述UPDATE语句的执行顺序

     1.客户端连接与权限验证 当客户端发送UPDATE语句到MySQL服务器时,首先会经过连接器

    连接器负责处理客户端连接,验证用户名和密码,以及检查用户权限

    只有拥有足够权限的用户才能执行UPDATE操作

     2. 查询缓存(已废弃) 在MySQL5.6及更早版本中,如果启用了查询缓存,服务器会检查缓存中是否存在相同的查询结果

    然而,由于UPDATE操作会改变数据,因此查询缓存对于写操作是无效的

    在MySQL5.6及以后版本中,查询缓存已被废弃,因为对于写多于读的场景,查询缓存会影响性能

     3. 语法与词法分析 经过权限验证后,UPDATE语句会到达分析器

    分析器负责进行语法分析和词法分析,检查SQL语句的关键词使用是否正确,顺序是否正确,以及表和列是否存在

    如果语句存在语法错误,分析器会返回错误信息

     4. 优化器生成执行计划 经过分析器处理后,UPDATE语句会进入优化器

    优化器的主要任务是生成一个最小成本的可执行计划,这涉及索引选择、表连接顺序优化等

    优化器会尝试找到最高效的方式来执行UPDATE操作

     5. 执行器与存储引擎交互 优化器生成的执行计划会传递给执行器

    执行器负责与存储引擎层进行交互,执行实际的UPDATE操作

    在InnoDB存储引擎中,UPDATE操作的执行流程如下: -开启事务:执行器首先会开启一个事务,准备更新磁盘中的数据

     -数据定位:通过索引(如主键)定位目标行

    如果数据页不在内存中(Buffer Pool),则从磁盘加载

     -加锁:为了防止并发修改,执行器会对目标行加排他锁

     -记录Undo Log:在修改数据之前,InnoDB会生成Undo Log,记录修改前的旧值

    Undo Log用于事务回滚和多版本并发控制(MVCC)

     -修改数据:在Buffer Pool中修改目标行的数据

    此时,数据页在Buffer Pool中被标记为脏页,因为还未同步到磁盘

     -记录Redo Log:InnoDB会将数据页的物理修改写入Redo Log

    Redo Log是物理日志,记录的是数据页的物理修改

    在事务执行过程中,Redo Log是实时写入的(顺序写入)

    在事务提交前,Redo Log的状态为Prepare

     -写入Binlog:Server层的执行器会将逻辑操作(UPDATE语句或行变更)写入Binlog

    Binlog是逻辑日志,记录的是SQL语句的逻辑操作,而不是物理页的修改

    Binlog用于数据恢复、主从复制和审计

     -提交事务:当所有修改完成并记录了必要的日志后,执行器会调用事务提交接口,提交事务

    此时,Redo Log的状态会被改为Commit,表示事务已提交

    同时,脏页会被异步刷盘到磁盘

     -释放锁资源:事务提交后,执行器会释放之前加上的排他锁

     三、日志机制与数据安全性 在UPDATE操作的执行过程中,MySQL使用了多种日志机制来保障数据的安全性和可恢复性

    这些日志包括Undo Log、Redo Log和Binlog

     1. Undo Log(撤销日志/回滚日志) Undo Log记录的是修改前的旧值,用于事务回滚和多版本并发控制

    在事务失败或需要回滚时,MySQL可以通过Undo Log恢复旧值

    此外,Undo Log还为其他事务提供一致性读视图,避免脏读

    在REPEATABLE READ隔离级别下,其他事务读取的是Undo Log中的旧版本数据

     2. Redo Log(重做日志) Redo Log记录的是数据页的物理修改

    它是InnoDB存储引擎特有的日志,用于崩溃恢复

    在事务执行过程中,Redo Log是实时写入的(顺序写入),这有助于提高性能并减少磁盘I/O

    当MySQL服务器宕机后重启时,可以通过重放Redo Log将未刷盘的脏页恢复,从而确保已提交事务的修改不会丢失

     Redo Log是循环写入的,文件大小是固定的(如ib_logfile0和ib_logfile1)

    当文件写满时,InnoDB会从头开始覆盖旧的日志

    为了确保数据的安全性,InnoDB会设置一些阈值来控制脏页的刷新频率

    例如,当脏页比例超过innodb_max_dirty_pages_pct_lwm时,开始刷新脏页到磁盘;当脏页比例超过innodb_max_dirty_pages_pct时,进入勤快刷新模式,更快地刷新脏页到磁盘

     3. Binlog(二进制日志) Binlog是MySQL Server层的日志,记录所有数据库表结构变更(如CREATE、ALTER TABLE等)以及表数据修改(如INSERT、UPDATE、DELETE等)

    它不记录SELECT和SHOW这类不修改数据的操作

    Binlog主要用于数据恢复、主从复制和审计

     Binlog的写入机制与Redo Log类似,但不是实时写入的

    在事务提交时,Server层的执行器会将逻辑操作写入Binlog cache中,然后一次性写入到Binlog文件中,并持久化到磁盘中

    这个过程中,write和fsync的时机是由参数sync_binlog控制的

    sync_binlog=0时,表示每次提交事务都只write,不fsync;sync_binlog=1时,每次事务提交都会fsync;sync_binlog=N时,每次事务都write,N次事务之后fsync

    为了提高性能并减少磁盘I/O,一般采用设置N的方式

    但需要注意的是,如果设置不当,可能会导致数据丢失

     四、Buffer Pool与性能优化 Buffer Pool是InnoDB存储引擎中的一个重要组件,用于缓存数据和索引页,以减少磁盘I/O并提高性能

    在UPDATE操作中,Buffer Pool扮演了关键角色

    当需要修改数据时,InnoDB会先从磁盘读取数据页到Buffer Pool中,然后在Buffer Pool中进行

阅读全文
上一篇:MySQL丢失更新案例解析

最新收录:

  • MySQL字符串数字混合排序技巧解析
  • MySQL丢失更新案例解析
  • MySQL设置联合主键与外键约束技巧
  • 深入解析:MySQL事务提交的全过程详解
  • 如何查询MySQL中的用户列表
  • MySQL POST手工注入:安全漏洞揭秘
  • MySQL启动失败,无进程运行怎么办
  • MySQL数据库:如何高效删除注释技巧详解
  • Windows MySQL远程连接问题解析
  • 《数据库MySQL第三版》精髓解读
  • MySQL数据库:探索数据表虚拟化技巧
  • 如何在MySQL中创建并调用存储过程指南
  • 首页 | mysql的update执行顺序:MySQL UPDATE执行顺序揭秘