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

如何执行更新SQL语句?

时间:2023-03-07 20:06:10 网络应用技术

  在上一篇文章中:“如何执行查询SQL语句?》介绍一些常用的组件。通常,它是一个功能模块,例如连接器,分析仪,优化器和执行器,最后到达存储引擎。这篇文章介绍了如何介绍如何介绍执行了更新语句,它也将介绍其他组件。让我们立即开始。

  我们知道,执行SQL操作线路时,磁盘的每个操作实际上都非常慢。要解决此问题,我们设置了一个缓冲池。此缓冲池只是一个存储器区域,它是由Innodb设置的,而不是MySQL的服务器。设置。其存在的原因之一是避免每次访问磁盘,将最常见的访问数据放入缓存中,并提高数据的访问速度。

  读取数据时,当数据位于内存中的数据页面时,返回要找到的数据页面。否则,相应的数据页将加载到内存,然后将返回结果;对于写作操作,如果要修改的行的数据页在内存中,则在修改后返回相应的结果。如果您不存在,则将读取与银行对应的数据页面,从磁盘和磁盘中读取内存中修改它。

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

  缓冲池的存在可以减少磁盘I/O引起的开销。对于加载数据页的不可避免的磁盘I/O,我们还可以优化它,即减少磁盘I/O的数量。在这里我们必须在这里。要说出预阅读概念。无论是操作系统还是存储引擎,都有一个预读概念,也就是说,当读取磁盘上的数据时,很可能附近的位置将立即读取。这被称为本地原理。因此,这样,我们只是一次读取更多的内容,而不是要阅读多少。最小的单元读取称为页面。操作系统中的页面大小通常为4KB,在InnoDB中,页面的大小为16KB。

  缓冲池的默认值为128m。由于大小有限,因此数据已满。目前,LRU算法将用于消除未使用的页面。

  重做日志称为重做日志,因为刷牙不是真实的 - 时间,并且磁盘数据的修改也将落后于内存。目前,如果过程或机器崩溃会导致内存数据丢失。INDB维护重做日志。此日志文件记录页面上的所有修改操作。恢复崩溃后,将更换重做日志,并在崩溃之前将页面恢复到状态。此功能称为崩溃安全。

  重做日志也记录在磁盘上,也写在磁盘上。为什么不直接将数据更新到数据库文件中。难道不是吗?这样做的原因是刷子磁盘是随机的I/O,并且记录日志是顺序的I/O,并且序列I/O更有效。从本质上讲,这是数据集存储和分散存储之间的差异。因此,数据首先写入日志文件中。借助内存数据的安全性,可以延迟系统的时机,以改善系统的吞吐量。

  重做日志默认值为2个文件,每个文件48m。

  下图显示了4个重做日志,这些日志是从头开始写的,然后返回开始回到开始。WritePOS是当前记录的位置。写作时写作,并在文件末尾写入后返回到0个文件的开头。3.CHECKPOINT是要删除的当前位置,并将其向后推并向后循环。在删除记录之前,应将记录更新到数据文件。写入POS和检查点之间的空部分可用于记录新操作和绿色零件。

  总结:

  可以理解,撤消日志记录反向操作。例如,插入将记录删除,更新将记录更新的原始值,这与重做日志记录的物理页面不同。

  撤消的一些设置:

  服务器层还具有自己的日志,称为binlog存档日志。首先,mySQL没有InnoDB Engine.mysql自己的引擎是Myisam,但Myisam没有碰撞安全的能力。BINLOG日志只能用于归档。InoDB以插件的形式介绍给mySQL。由于它仅依赖Binlog,因此没有崩溃的安全功能,因此InnoDB使用了另一个日志系统,即重做日志以实现崩溃安全功能。

  重做日志是一个物理日志,可记录您在数据页面上进行的修改;BINLOG是一个逻辑日志,它记录了此语句的原始逻辑,例如将1添加到ID = 2.binlog的C字段中,以事件形式记录所有DDL和DML语句。

  重做日志以循环写入,空间是固定的;可以添加binlog。“附加写作”意味着在编写一定尺寸后,BINLOG文件将切换到下一个文件,并且不会覆盖先前的日志。

  Binlog可以进行数据恢复。在打开Binlog函数的情况下,我们可以将Binlog导出到SQL语句中并再次替换所有操作。Binlog的另一个功能是复制为主和从属。它的原则是从服务器读取主服务器的Binlog,然后执行。

  在上面引入许多功能。现在让我们看看如何执行更新语句?

  更新用户集名称='AAA'其中ID = 1;

  整个执行过程如下:

  整个流程图如下:

  编写binlog和重做日志使用了两个提交阶段。

  https://dev.mysql.com/doc/refman/5.7/innodb-ralitecture.html

  让我们看一下此体系结构图分为两个部分,一个是内存区域,另一个是磁盘区域。有四个组件:缓冲池,更改缓冲区,自适应哈希和日志缓冲区。

  缓冲池在上面引入。

  当需要更新数据页面时,如果数据页在内存中直接更新,则该数据页面不在内存中,而不会影响数据的一致性,INODB将减慢这些更新操作。您无需从磁盘读取此数据页面。当您需要查询时需要访问此数据页面时,将数据页读取到内存中,然后执行与“更改buffer”中的与此页面相关的操作。方法可以确保此数据逻辑的正确性。

  前提是没有唯一的索引。对于唯一索引,所有更新操作都必须首先确定是否违反了该操作。必须将其读取为记忆以进行判断。无需使用更改缓冲区。

  5.5在称为插入缓冲区插入缓冲区之前,它现在可以支持删除和更新。将更改缓冲区中的操作应用于原始数据页面,并且获得最新结果的过程称为Merge.in此处以访问此数据页面。为了触发合并,系统具有定期合并的背景线程。在数据库正常关闭过程(关闭)过程中,还将执行合并操作。

  如果数据库的大多数索引不是唯一的索引,并且业务是阅读更多和更少的阅读,并且在编写数据后不会立即阅读,则可以使用更改缓冲区。通过调整此值以支持编写更多业务方案来更改。更改缓冲区默认值与缓冲区池的比例为25%。

  索引放在磁盘上,哈希索引放在内存上。

  我们知道重做日志存储在磁盘上,但并非每次直接写入磁盘时。缓冲区池中有一个内存区域日志缓冲区,以减少磁盘io。

  那么,日志缓冲区何时会写入磁盘?日志缓冲区对磁盘的时机由参数控制,默认值为1。

  innodb_flush_log_at_trx_commit值为0

  innodb_flush_log_at_trx_commit值为1

  innodb_flush_log_at_trx_commit值为2

  让我们看一下磁盘区域,该区域主要是各种表,称为表空间。表空间可以视为InnoDB存储引擎的逻辑结构的最高级别,所有数据都存储在表空间中.innodb的表空间分为5个类别。

  默认情况下,InnoDB存储引擎具有共享表空间,即/var/lib/mysql/ibdata1文件,也称为系统表空间。系统表空间包含数据字典,双写缓冲区,更改缓冲区和撤消日志。如果没有每个文件,它还包括用户创建的表和索引数据。

  数据字典由内部系统表,存储表和索引元数据(定义信息)组成。双重写入缓冲区的用途是什么?我们知道InnoDB的页面大小为16K,并且操作系统的页面为4K。从InnoDB到磁盘写作时,必须写4次。

  如果将数据写入磁盘时,存储引擎是停机时间,则页面只能在页面的一部分中写入。一旦编写了4K或8K数据,就无法保证操作的原子性。当时的写入页面。这次,引入了双写入缓存区域。当出现极端情况时,您可以从系统表空间的双写缓冲区[磁盘]中恢复,该空间等同于副本,以实现数据页面的可靠性。

  Chang Buffer已与内存中的内存中的磁盘同步。默认情况下,所有表空间共享一个系统表空间,此文件将变得越来越大,其空间不会缩小。

  我们可以允许每个桌子垄断表空间。此开关由Innodb_file_per_table设置,默认情况下打开。

  打开后,每个桌子将打开一个表空间。该文件是数据目录中的IDB文件,例如/var/lib/mysql/jack/user_innodb.ibd,表的索引和数据。

  但是,其他类型的数据,例如滚动信息撤消日志,插入的缓冲区页面,系统交易信息,双写入缓冲区双写缓冲区等。它仍然存储在原始的共享表空间中。

  一般表空间也是共享表空间,类似于IBDATA1。可以创建一个常规表空间来存储不同数据库,数据路径和文件的表格。

  创建tabrespace jacktableSpace添加datafile'/my/tablespace/directory/ts1.ibd'file_block_size = 16k egine = innodb;

  创建表格时,您可以指定表空间

  创建表T1(C1 int主键)表空间jacktablespace;

  可以移动不同表空间的数据,并通过Alter修改表空间

  Alter表T2表空间jacktablespace;

  删除表空间需要首先删除,因此元素

  Drop Table T1 Drop Table T2 Drop Tabrespace JackTableSpace

  临时表的数据,包括用户创建的临时表和磁盘的内部临时表。数据目录中的ibtmp1文件。当正常关闭数据服务器时,下次将删除表空间并重新出现。。

  撤消日志的数据在系统表空间IBDATA1文件中。由于共享表空间不会自动缩小,因此它也可以分别创建一个撤消表空间。

  好吧,通过查询如何执行SQL和更新SQL的两篇文章,我介绍了MySQL组件。我相信每个人都对MySQL的底层原理有一定的了解。谢谢您的观看。欢迎来到一些。

  原始:https://juejin.cn/post/7103092370849153061