暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

执行update语句,数据库都经历了什么

解压泡泡糖 2025-04-28
225

当你执行一个 UPDATE 语句时,数据库会经历多个步骤来确保数据正确更新并且保持一致性。下面是执行 UPDATE 语句时数据库内部的处理流程:

1. SQL解析(SQL Parsing)

当你输入并执行 UPDATE 语句时,数据库首先会对该 SQL 语句进行 解析。数据库的查询解析器(Query Parser)会分析 UPDATE 语句的语法结构,检查语法是否正确。

如果语法错误,数据库会返回错误提示。

如果语法正确,解析器会将 SQL 语句转换为内部的执行计划,通常会生成一个 抽象语法树(AST) 或 查询树,用来表示 SQL 语句的逻辑结构。

2. 查询优化(Query Optimization)

数据库的查询优化器(Query Optimizer)会根据 UPDATE 语句的条件、表结构以及索引等信息,生成一个优化过的执行计划。这些优化可能包括:

选择合适的索引:如果更新条件涉及到索引列,数据库会尽量使用索引来提高效率,减少全表扫描。

避免锁定过多行:优化器会选择高效的访问路径,以尽量减少锁的范围。

分析数据访问方式:优化器会选择最优的扫描方式,比如使用 索引扫描、表扫描,或结合两者。

3. 锁定资源(Locking)

在执行更新之前,数据库需要对相关的行或表进行锁定,以确保数据的 一致性 和 隔离性。常见的锁定方式包括:

行级锁(Row Lock):锁定要更新的具体行,允许其他事务访问表中未锁定的行。

表级锁(Table Lock):锁定整个表,适用于整个表都需要更新的情况。

锁定是为了避免并发事务带来的冲突和脏读、幻读等问题。

4. 读取旧数据(Fetching Old Data)

在执行更新之前,数据库会根据 UPDATE 语句的条件(如 WHERE 子句)去查找满足条件的记录。这一过程可能会通过 索引 或 全表扫描 来实现。

数据库会读取 旧数据(即更新前的数据),然后根据更新的字段值计算出新的数据值。

5. 数据修改(Data Modification)

数据库会将读取到的行数据 修改为新的值,并将修改后的数据存储到数据页中。修改的过程通常包括:

更新数据页:如果该表的数据存储在 聚簇索引 或 堆表 中,数据库会在存储页中直接更新数据。

操作事务日志:数据库会将 UPDATE 操作记录到 事务日志(如WAL,Write-Ahead Logging),这确保了操作的可恢复性。

写入新的数据:如果数据库采用 MVCC(多版本并发控制),则可能会创建数据的新版本,而不是直接修改原数据。这是为了避免正在进行的事务与其他事务之间的冲突。

6. 事务日志(Write-Ahead Logging)

数据库的事务日志会记录下所有修改的内容,确保在系统崩溃时能够恢复数据。这是为了保证 原子性 和 持久性(ACID 特性)。

日志条目:事务日志会记录操作的类型(如 UPDATE)、修改的表、被修改的数据行以及修改的值。

写前日志(WAL):在修改数据之前,事务日志会先写入日志,保证数据的 持久性。

这样,如果系统崩溃或断电,数据库可以根据日志恢复未完成的事务操作。

7. 刷新缓冲池(Buffer Pool Flush)

数据库通常会将数据保存在内存中的缓冲池(Buffer Pool)中,而不是立刻写入磁盘。数据库会定期或在事务提交时将修改后的数据刷新到磁盘上。

如果使用 InnoDB 存储引擎,数据页修改会记录到 重做日志(Redo Log) 中,确保即使系统崩溃,数据也不会丢失。

8. 事务提交(Commit)

如果 UPDATE 语句是一个事务的一部分,当事务提交时,所有的修改将被永久保存。如果事务回滚(ROLLBACK),所有的修改将被撤销。

在提交时,数据库会:

写入提交日志:确保事务的 持久性。

释放锁:释放之前的行锁或表锁,允许其他事务继续操作。

刷盘操作:将修改的数据页写入磁盘,确保数据持久化。

9. 触发器(Trigger)

如果表上定义了触发器(如 AFTER UPDATE 或 BEFORE UPDATE),数据库会在 UPDATE 操作前后调用相关触发器。

例如,可以在更新时自动更新某个时间戳字段、执行审计日志记录等。

10. 更新索引(Index Update)

如果 UPDATE 语句涉及到索引列的更新,数据库还需要 更新相关索引。例如:

如果更新的字段是索引的一部分,数据库会更新该索引,确保索引的正确性。

对于非聚簇索引,数据库可能需要在索引页中删除旧的索引项,并插入新的索引项。

11. 事务隔离性和并发控制

数据库会根据事务的隔离级别(如 READ COMMITTED、SERIALIZABLE)控制并发,确保其他事务无法读取到未提交的数据(避免脏读、幻读等问题)。

例如,某些隔离级别下,在事务提交之前,其他事务不能看到已经修改但尚未提交的行。

总结:

执行 UPDATE 语句时,数据库会经历以下几个关键步骤:

解析 SQL 语句,生成执行计划。

优化查询,选择最优执行路径。

锁定相关资源,确保并发访问安全。

读取并修改数据,记录事务日志。

刷新缓冲池,将数据写入磁盘。

提交事务,释放锁,确保数据持久性。

更新索引,执行相关触发器。

这些过程确保了 数据的一致性、隔离性、持久性 和 高效性,同时保证了多用户环境下的并发控制。

文章转载自解压泡泡糖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论