首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基础架构:一条SQL查询语句是如何执行的?
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
07 | 行锁功过:怎么减少行锁对性能的影响?
08 | 事务到底是隔离的还是不隔离的?
09 | 普通索引和唯一索引,应该怎么选择?
10 | MySQL为什么有时候会选错索引?
11 | 怎么给字符串字段加索引?
12 | 为什么我的MySQL会“抖”一下?
13 | 为什么表数据删掉一半,表文件大小不变?
14 | count(*)这么慢,我该怎么办?
15 | 答疑文章(一):日志和索引相关问题
16 | “order by”是怎么工作的?
17 | 如何正确地显示随机消息?
18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?
19 | 为什么我只查一行的语句,也执行这么慢?
20 | 幻读是什么,幻读有什么问题?
21 | 为什么我只改一行的语句,锁这么多?
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
23 | MySQL是怎么保证数据不丢的?
24 | MySQL是怎么保证主备一致的?
25 | MySQL是怎么保证高可用的?
26 | 备库为什么会延迟好几个小时?
27 | 主库出问题了,从库怎么办?
28 | 读写分离有哪些坑?
29 | 如何判断一个数据库是不是出问题了?
30 | 答疑文章(二):用动态的观点看加锁
31 | 误删数据后除了跑路,还能怎么办?
32 | 为什么还有kill不掉的语句?
33 | 我查这么多数据,会不会把数据库内存打爆?
34 | 到底可不可以使用join?
35 | join语句怎么优化?
36 | 为什么临时表可以重名?
37 | 什么时候会使用内部临时表?
38 | 都说InnoDB好,那还要不要使用Memory引擎?
39 | 自增主键为什么不是连续的?
40 | insert语句的锁为什么这么多?
41 | 怎么最快地复制一张表?
42 | grant之后要跟着flush privileges吗?
43 | 要不要使用分区表?
44 | 答疑文章(三):说一说这些好问题
45 | 自增id用完怎么办?
当前位置:
首页>>
技术小册>>
MySQL 实战 45 讲
小册名称:MySQL 实战 45 讲
### 02 | 日志系统:一条SQL更新语句是如何执行的? 在MySQL数据库中,理解日志系统对于优化数据库性能、确保数据一致性以及实现数据恢复至关重要。当我们执行一条SQL更新语句时,背后涉及了复杂的流程,这些流程不仅直接影响了数据的变更,还通过日志系统确保了操作的原子性、一致性、隔离性和持久性(ACID特性)。本章节将深入探讨MySQL中的日志系统,特别是当执行一条更新语句时,这些日志是如何协同工作的。 #### 一、MySQL日志系统概览 MySQL的日志系统包括多种类型的日志,每种日志都有其特定的用途和存储方式。对于理解更新语句的执行过程,我们主要关注以下几种日志: 1. **二进制日志(Binary Log)**:记录了所有的DDL(数据定义语言)和DML(数据操纵语言)语句(除了SELECT和SHOW这类不修改数据的语句),以及这些语句所影响的数据的变更。它是MySQL复制和数据恢复的基础。 2. **重做日志(Redo Log)**:是InnoDB存储引擎特有的日志,用于确保事务的持久性。当事务提交时,重做日志中的记录会被用来在崩溃后恢复数据。 3. **撤销日志(Undo Log)**:同样由InnoDB引擎管理,用于记录事务开始前的数据状态,以便在事务失败或需要回滚时能够恢复到原始状态。 4. **错误日志(Error Log)**:记录了MySQL服务启动、运行或停止时的错误信息,对于诊断问题非常有用。 5. **慢查询日志(Slow Query Log)**:记录了执行时间超过设定阈值的查询语句,帮助识别性能瓶颈。 6. **查询日志(General Query Log)**:记录了所有对MySQL服务器的请求,包括客户端连接和断开连接的信息,以及执行的SQL语句。由于记录信息量大,通常只在调试时启用。 #### 二、一条SQL更新语句的执行流程 当我们执行一条SQL更新语句时,MySQL内部会经历一系列复杂的步骤,这些步骤与上述日志系统紧密相关。以下是一个简化的执行流程: 1. **解析(Parsing)**: - MySQL首先解析SQL语句,检查语法是否正确,并确定要执行的操作类型(如UPDATE)。 - 此阶段不涉及日志记录。 2. **预处理(Preprocessing)**: - 验证语句中的表和数据是否存在,检查权限等。 - 同样,此阶段不直接产生日志记录,但为后续的日志生成做准备。 3. **优化(Optimization)**: - MySQL查询优化器会分析查询,并尝试找到最高效的执行计划。 - 优化过程本身不直接写入日志,但优化结果会影响后续日志的生成(如哪些行将被更新)。 4. **执行(Execution)**: - **修改内存中的数据**:首先,在InnoDB的缓冲池中修改数据页中的记录。 - **写入重做日志**:在修改内存中的数据之前,InnoDB会先将变更信息写入重做日志中。这是为了确保即使在系统崩溃的情况下,也能通过重做日志恢复数据。 - **生成撤销日志**:同时,为了支持事务的回滚,InnoDB还会生成相应的撤销日志记录。 5. **提交事务(Transaction Commit)**: - 当事务被提交时,MySQL会确保所有相关的日志(包括二进制日志和重做日志)都已正确写入磁盘。 - 对于InnoDB,这通常意味着重做日志的提交点(checkpoint)会被更新,确保之前的日志记录是持久的。 - 二进制日志也会记录这条更新语句及其影响的数据变更,以便用于复制和数据恢复。 6. **响应客户端**: - 一旦事务提交成功,MySQL会向客户端发送确认消息,表示更新操作已完成。 #### 三、日志系统的作用与影响 1. **数据恢复**: - 二进制日志和重做日志是数据恢复的关键。通过重放这些日志中的记录,可以在系统崩溃后恢复数据到最近的状态。 2. **复制(Replication)**: - MySQL的复制功能依赖于二进制日志。主服务器上的二进制日志会被发送到从服务器,从服务器再重放这些日志中的事件,从而实现数据的同步。 3. **事务的持久性和原子性**: - 重做日志确保了事务的持久性,即使系统崩溃,也能通过日志恢复数据。 - 撤销日志则支持事务的原子性,允许在需要时回滚到事务开始前的状态。 4. **性能影响**: - 日志的写入会对性能产生影响,尤其是当系统负载较高时。因此,合理配置日志系统(如调整日志文件的存储位置、大小、刷新策略等)对于优化性能至关重要。 #### 四、最佳实践与优化建议 1. **合理配置日志级别和类型**: - 根据实际需求启用或禁用不同类型的日志。例如,在生产环境中,通常只开启错误日志和二进制日志,而关闭查询日志和慢查询日志(除非需要调试)。 2. **优化日志存储**: - 将日志文件存储在高性能的磁盘上,以减少I/O等待时间。 - 定期清理不再需要的日志文件,避免占用过多的磁盘空间。 3. **调整日志刷新策略**: - 对于二进制日志和重做日志,可以通过调整相关参数来控制日志的刷新频率,以平衡性能和数据安全性。 4. **监控日志系统**: - 定期检查日志文件的大小和增长情况,及时发现并解决潜在的问题。 - 使用日志分析工具来识别性能瓶颈和异常行为。 5. **利用日志进行故障排查**: - 当系统出现问题时,首先检查相关的日志文件,以获取错误信息和系统状态的快照。 通过深入理解MySQL的日志系统以及它们如何协同工作来执行一条SQL更新语句,我们可以更好地优化数据库性能、确保数据的安全性和一致性,并在必要时进行有效的故障排查和数据恢复。
上一篇:
01 | 基础架构:一条SQL查询语句是如何执行的?
下一篇:
03 | 事务隔离:为什么你改了我还看不见?
该分类下的相关小册推荐:
MySQL从入门到精通(五)
SQL零基础到熟练应用(增删改查)
MySQL8.0入门与实践
细说MySQL(零基础到高级应用)
MySQL从入门到精通(二)
MySQL从入门到精通(一)
MySQL从入门到精通(四)
MySQL从入门到精通(三)
MySQL必会核心问题