热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我所理解的MySQL之一:基础架构

今天MySQL教程栏目为大家介绍我所理解的基础架构。

今天MySQL教程栏目为大家介绍我所理解的基础架构。

从上图可以看到,与客户端的交互中,MySQL 的服务端分别经过了连接器、查询缓存、分析器、优化器、执行器和存储引擎这几部分。

下面就以一条简单的查询语句来描述 MySQL 服务端的各组成部分及它们所起的作用。

2.1 连接器

在客户端提交查询语句之前,需要与服务端建立连接。所以最先来到的是连接器,连接器的作用就是负责与客户端建立、管理连接,同时查询用户的权限

需要注意的是:

  • 连接器只获取用户的权限,并不做校验,校验是在查询缓存或执行器才进行。
  • 一旦建立连接同时获取用户的权限之后,只有建立新的连接才会刷新用户权限。
  • 对于长时间没有发送请求的客户端,连接器会自动断开连接。这里的「长时间」是由 wait_timeout 参数来决定的,它的默认值为8小时。

2.2 查询缓存

在经过连接器的建立连接、获取用户权限之后,接下来用户可以提交查询语句了。

最先经过的是查询缓存部分,由它的名字也能够猜到,查询缓存的作用就是查询 MySQL 是否执行过客户端提交的查询语句,如果这条 SQL 之前执行过,并且用户对该表有执行该语句的权限,就会直接返回之前执行的结果。

所以在某些时候,多次执行一句 SQL 并不能得到它的平均执行时间,因为查询缓存的关系,后面的执行时间往往比第一次执行要短。

如果你不想使用缓存,可以在每次查询后都用 update 语句更新表,当然这是非常麻烦并且憨的方法。MySQL也提供了相应的配置项—— query_cache_type,你可以在 my.cnf 文件中将 query_cache_type 设置为0以关闭查询缓存。

需要注意的是:

  • 查询缓存部分是以 key-value 形式进行存储的,key 为查询语句,value 是查询结果。
  • 当对数据表进行更新时,关于这张表的所有查询缓存都会失效,所以一般来说查询缓存的命中率是很低的。
  • MySQL 8.0 的版本中,查询缓存的功能已经被删除。

2.3 分析器

我使用的 MySQL 版本是5.7.21,所以客户端提交的查询语句会走查询缓存,如果没有命中,那么将继续往下走,来到分析器。

分析器会对提交的语句进行词法分析(解析语句)和语法分析(判断语句是否符合 MySQL 的语法规则),所以分析器的作用就是解析 SQL 语句并检查其合法性

需要注意的是:

  • MySQL 在检查 SQL 语句合法性时,仅会在最先不符合 MySQL 语法规则的地方提示错误,并不会将 SQL 语句中所有语法错误的地方全部展示。

举个例子:

select * form user_info limit 1; 

上面这句 SQL 有两个错误,第一是 from 拼写错误,第二是不存在 user_info 这张表,在执行之后,MySQL只会提醒一个错误,下面展示了三次执行 SQL 的结果信息。

第一次的执行信息:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'form user_info limit 1' at line 1, Time: 0.000000s

修改为from后第二次的执行信息:1146 - Table 'windfall.user_info' doesn't exist, Time: 0.000000s

修改为 user 表后第三次的执行信息:
OK, Time: 0.000000s 

2.4 优化器

在校验了 SQL 语句的合法性之后,MySQL 已经知道用户提交的语句是干什么的了,但是在真正执行之前,还需要经过非常“玄学”的优化器。

最开始这两个指针都指向同一个节点,且节点日志元素都为空,表示此时 redo log 为空。当用户开始提交更新语句,write 节点开始往前移动,假设移动到3的位置。而此时的情况就是 redo log 中有1-3这三个日志元素需要被持久化到磁盘中,当 InnoDB 空闲时,read 指针往前移动,就代表着将 redo log 持久化到磁盘。

但这里有一种特殊情况,就是 InnoDB 一直没有空闲,write 指针一直在写入日志,直到它写到5的位置,再往前写又回到了最开始1的位置(也就是上图的位置,但不同的是链表节点中都存在日志数据)。

此时发现1的位置已经有日志数据了,同时 read 指针也在。那么这时候 write 指针就会暂停写入,InnoDB 引擎开始催动 read 指针移动,把 redo log 清空掉一部分之后再让 write 指针写入日志文件。

3.1.4 redo log 的作用

我们已经知道,redo log 中记录的是数据页的物理修改,所以 redo log 能够保证在数据库发生异常重启时,记录尚未写入磁盘,但是在重启后可以通过 redo log 来“redo”,从而不会发生记录丢失的情况,保证了事务的持久性。

这一能力也被称作 crash-safe

3.2 归档日志 bin log

前面说到 redo log 是 InnoDB 特有的日志,而 bin log 则是属于 MySQL Server 层的日志,在默认的 Statement Level 下它记录的是更新语句的原始逻辑,即 SQL 本身。

另外需要注意的是:

  • bin log 的日志文件大小并不固定,它是“追加写入”的模式,写完一个文件后会切换到下一个文件写入。
  • bin log 没有 crash-safe 的能力。
  • bin log 是在事务最终提交前写入的,而 redo log 是在事务执行中不断写入的。

3.2.1 bin log 的作用

与 redo log 不同的是,bin log 常用于恢复数据,比如说主从复制,从节点根据父节点的 bin log 来进行数据同步,实现主从同步。

3.3 两阶段提交

为了让 redo log 和 bin log 的状态保持一致,MySQL 使用两阶段提交的方式来写入 redo log 日志。

在执行器调用 InnoDB 引擎的接口将写入更新数据时,InnoDB 引擎会将本次更新记录到 redo log 中,同时将 redo log 的状态标记为 prepare,表示可以提交事务。

随后执行器生成本次操作的 bin log 数据,并写入 bin log 的日志文件中。

最后执行器调用 InnoDB 的提交事务接口,存储引擎把刚写入的 redo log 记录状态修改为 commit,本次更新结束。

在这个过程中有三个步骤 add redo log and mark as prepare -> add bin log -> commit,即:

  1. 写入 redo log 日志并标记为 prepare
  2. 写入 bin log
  3. 提交事务

如果在第二个步骤,也就是写入 bin log 之前系统崩溃或重启,启动后由于 bin log 中没有记录,会将 redo log 中的记录回滚至执行本次更新语句前。

如果在第三个步骤前,也就是提交之前系统崩溃或重启,即便没有 commit 但是满足 redo log 中记录为 prepare 状态并且 bin log 中也有完整记录,在重启后会自动 commit,并不会回滚。

4. 小结

本文主要介绍 MySQL 的基础架构以及各个组成部分的功能,最后介绍了 MySQL Server 层的 bin log 和 InnoDB 特有的 redo log 这两种日志模块。

5. 温故知新

以下的几个问题是对本文所描述内容的提问,巩固知识,正所谓“温故而知新,可以为师矣”。

  1. 如果查询语句中字段不存在、字段有歧义、关键字拼写错误,是由哪个部分报错?
  2. 如果用户对表没有查询权限,是哪个部分报错?
  3. 为什么 MySQL 的查询缓存会无效?
  4. 一条 select 查询语句是如何执行的?
  5. MySQL 常用的存储引擎有哪些?
  6. MySQL 的日志模块有哪些?分别起到什么作用?
  7. redo log 写满了怎么办?
  8. 如何理解 redo log 的两阶段提交?
  9. redo log 和 bin log 的区别?

更多相关免费学习推荐:mysql教程(视频)

以上就是我所理解的MySQL之一:基础架构的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 开发日志:在插入数据到一张表的同时更新另一张表的技术细节与最佳实践 ... [详细]
  • 在计算机领域,锁机制的作用类似于现实生活中的锁,用于保护共享资源免受并发访问冲突的影响。对于Java开发人员而言,深入了解数据库锁定机制至关重要,因为这不仅能够确保数据的一致性和完整性,还能有效提升系统的性能和稳定性。常见的锁机制包括Java中的`Lock`和`synchronized`关键字,它们在多线程环境中发挥着关键作用,帮助开发人员更好地管理和控制资源访问。 ... [详细]
  • PHP与MySQL的Web应用开发技术深入解析
    PHP与MySQL的Web应用开发技术深入解析 ... [详细]
  • Syncnavigator激活工具及破解方法详解
    本文详细介绍了Syncnavigator激活工具的使用方法及其破解技巧。用户可以通过访问官方网站www.SyncNavigator.CN获取相关资源,并通过客服QQ 1793040获得技术支持和帮助。此外,文章还提供了详细的步骤说明和常见问题解答,以确保用户能够顺利激活并使用Syncnavigator软件。 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • 本文详细介绍了 PHP 中 `sprintf` 函数的使用方法,并通过具体示例进行说明。例如,使用 `%%` 作为参数时,`%%` 会被替换为 `%`。通过 `echo sprintf($str)` 可以验证这一行为,返回的结果是“测试一下 % 这个参数,会被替换成什么”。此外,文章还探讨了 `sprintf` 函数在格式化字符串中的多种应用场景,包括数字格式化、日期时间处理等,帮助读者全面掌握该函数的使用技巧。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • PHP 数组逆序排列方法及常用排序函数详解 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 【漫画解析】数据已删,存储空间为何未减?揭秘背后真相
    在数据迁移过程中,即使删除了原有数据,存储空间却未必会相应减少。本文通过漫画形式解析了这一现象背后的真相。具体来说,使用 `mysqldump` 命令进行数据导出时,该工具作为 MySQL 的逻辑备份工具,通过连接数据库并查询所需数据,将其转换为 SQL 语句。然而,这种操作并不会立即释放存储空间,因为数据库系统可能保留了已删除数据的碎片信息。文章进一步探讨了如何优化存储管理,以确保数据删除后能够有效回收存储空间。 ... [详细]
  • PHP开发人员薪资水平分析:工程师平均工资概况
    PHP开发人员薪资水平分析:工程师平均工资概况 ... [详细]
  • 本文介绍了MySQL中一些基本但重要的数学函数,包括角度与弧度之间的转换函数RADIANS(X)和DEGREES(X),以及正弦函数。RADIANS(X)用于将角度值转换为弧度值,而DEGREES(X)则将弧度值转换为角度值。这些函数在处理涉及角度和弧度的计算时非常有用,能够简化复杂的数学运算。此外,正弦函数在三角学和工程计算中也具有广泛的应用,能够帮助用户更高效地进行数据处理和分析。 ... [详细]
  • 本文详细解析了MySQL中的多表联合查询技术,涵盖了内连接、外连接和交叉连接三种主要类型。通过具体示例,深入探讨了每种连接方式的使用场景和实现方法,帮助读者全面掌握SQL查询技巧,提升数据处理能力。 ... [详细]
  • 在数据库事务处理中,InnoDB 存储引擎提供了多种隔离级别,其中 READ COMMITTED 和 REPEATABLE READ 是两个常用的选项。本文详细对比了这两种隔离级别的特点和差异,不仅从理论角度分析了它们对“脏读”和“幻读”的处理方式,还结合实际应用场景探讨了它们在并发控制和性能表现上的不同。特别关注了行锁机制在不同隔离级别下的行为,为开发者选择合适的隔离级别提供了参考。 ... [详细]
author-avatar
淼淼L玖兰枢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有