当前位置: 首页 > 网络应用技术

您知道MySQL Update语句背后隐藏了哪些秘密吗?

时间:2023-03-08 23:15:16 网络应用技术

  在上一篇文章中,我们解释了MySQL查询语句的执行过程。如果您有兴趣,可以去看:访调员:MySQL如何执行查询语句?

  让我们谈谈本文中MySQL Update语句的执行原则。更新过程和查询过程之间有什么区别?

  基本过程也是相同的,也就是说,它必须由解析器和优化者处理,最后移交给执行器。

  区别在于获取合格数据后的操作。

  首先,InnoDB的数据放在磁盘上。对于存储引擎,必须首先将数据加载到内存中。

  这里有一个问题。一次需要从磁盘上加载多少数据?

  磁盘I/O的读写比内存的操作非常慢。如果我们需要的数据散布在磁盘的不同位置,则意味着I/O操作将生产多次。

  因此,无论是操作系统还是存储引擎的文件管理系统,都有一个预读概念。换句话说,当读取磁盘上的数据时,附近的位置可能会立即阅读。这就是所谓的本地原理。因此,我们只需一次阅读更多内容,而不是要阅读多少。

  我们已经设置了一个具有最小存储引擎的单元,以将数据读取到最小内存,称为页面。操作系统还具有页面概念。操作系统的页面大小通常为4K,在Innodb中,最小的单元默认值为16KB大小,它是一个逻辑单元。

  我们要操作的数据在这样的页面中,数据所在的页面称为数据页面。我们并非每次都直接操作磁盘,因为磁盘的速度太慢了。

  使用缓冲箱的技术,即,该页面读取磁盘放置在存储区域中。下次读取同一页面,首先判断它是否在此内存区域中。如果是这样,请直接读取它,而无需再次访问磁盘。此内存区域称为缓冲池。

  接下来,让我们看一下整个MySQL体系结构中的整个MySQL架构中的哪种类型。有宏观的理解。

  修改数据时,首先修改缓冲池中的页面。当数据页面和磁盘数据不一致时,我们称其为Dirty Pages.innodb具有专用的背景线程,可以将缓冲区池的数据写入磁盘。每次都会对磁盘进行多次修改。此动作称为肮脏。

  在上图中,您可以看到很多文件(重做日志,binlog,撤消日志),让我们在下面分析它们。

  考虑一个问题:如果数据库没有刷入磁盘,则当丢失缓冲池中的污垢页面时,数据库将丢失或重新启动。

  为了避免此问题,InnoDB专门在页面上的所有修改操作上写一个日志文件,并在数据库启动(实现崩溃安全)时从该文件中恢复 - SS使用它来实现交易的耐用性。

  该文件是磁盘的重做日志(称为重做日志),对应于目录中的和平,每个48m。

  这种与磁盘的混合过程的整个过程实际上是在MySQL中进行的Wal-Ahead登录。它的要点是编写日志,然后编写磁盘。

  问题:它也在编写磁盘。为什么不直接在DB文件中写入?为什么在编写磁盘之前写日志?

  让我们首先了解随机I/O和顺序I/O的概念。

  如果我们需要的数据随机散布在磁盘上不同页面上的不同扇区中,则相应的数据需要等到磁臂旋转到指定页面,然后找到板以找到相应的扇区,然后才能找到相应的扇区在此过程中,我们需要的数据是,直到找到所有数据,这是随机的IO,并且读取数据很慢。

  假设我们找到了第一个数据,而其他必需的数据是该数据后面的数据,那么我们不需要再次解决它。我们可以按顺序获取所需的数据。这称为顺序IO。

  刷牙是随机的I/O,并且记录日志是顺序的I/O(连续编写),并且顺序I/O效率更高。因此,当内存数据为时,可以延迟装修徽标文件的修订确保确保内存数据的安全性,从而改善系统吞吐量。

  此重做日志的特征是什么?

  除重做日志外,还有一个关于修改的日志,称为undo log.REDO日志和撤消日志与事务密切相关,共同称为事务日志。

  撤消日志(提取日志或滚动日志)记录事务发生之前的数据状态(不包括选择)。如果数据在修改数据时数据异常,则可以使用撤消日志来实现滚动操作(维护原子)。

  执行撤消时,数据仅在交易前才逻辑地恢复到状态,而不是从物理页面进行操作。它属于逻辑格式。

  撤消日志的数据位于系统表空间IBDATA1文件中,因为共享表空间不会自动缩小,并且可以单独创建撤消表空间。

  使用这些日志,让我们总结执行MySQL Update语句的过程。这是一个简化的过程。名称的原始值为;

  在内存和磁盘之间,有许多背景线程。什么是背景线程?

  背景线程的主要作用是刷新内存池中的数据并将修改后的数据页面刷新为磁盘。背景线程分为:

  除了InnoDB体系结构中的日志文件外,MySQL Server层还具有一个名为BINLOG的日志文件,该文件可以由所有存储引擎使用。

  BINLOG以事件的形式记录所有DDL和DML语句(因为它记录了操作而不是数据值,这是逻辑日志),可用于掌握复制和数据恢复。

  与重做日志不同,可以添加其文件内容而无需固定尺寸限制。

  在打开Binlog函数的情况下,我们可以将Binlog导出到SQL语句中,然后再次替换所有操作以实现数据恢复。

  BINLOG的另一个功能是实现Master -Lave Replication。它的原则是从服务器读取主服务器的Binlog,然后再次执行。

  有了这两个日志,让我们看一下如何执行更新语句(重做不能一次编写):

  例如,一个句子:

  MySQL更新声明的执行过程的原则已清楚地说。最后,让我们总结一下要点: