Code前端首页关于Code前端联系我们

MySQL数据库InnoDB存储引擎背后的逻辑架构

terry 2年前 (2023-09-26) 阅读数 46 #数据库

MySQL数据库有很多存储引擎,其中给我们印象最深的是InnoDB存储引擎,此后一直是默认的存储引擎。 MySQL 5.5。它的优点是支持事务、行级锁、MVCC和外键。

那么你知道InnoDB存储引擎背后的逻辑架构吗?现在我们来谈谈InnoDB存储引擎。

InnoDB存储引擎主要由两部分组成,分别是内存架构磁盘架构。两个部分都有自己必要的任务。我们通过图片来仔细看看这两个部分。

MySQL 数据库InnoDB 存储引擎的底层逻辑架构

Memory Architecture

Memory Architecture(英文名:In-Memory Structures),引擎主要有四个自适应部分,在哈希的名字里是四个存储空间InnoDB 零件:缓冲区存储更改缓冲区日志缓冲区

1。自适应哈希索引

先说自适应哈希索引。自适应哈希索引的英文名称为:Adaptive Hash Index它的设计目的是使 MySQL 数据库与内存数据库一样高效,而不会丢失事件、行锁和外键等功能

我们没有人为创建它,而是InnoDB存储引擎通过索引控制机制自动创建它。也就是说,如果InnoDB存储引擎观察到自适应哈希索引可以提高查询速度,那么InnoDB存储引擎会自动为此查询创建自适应哈希索引。命中自适应哈希索引的查询不会触发全表扫描,而是直接通过索引获取必要的信息,可以提高数据库查询速度。

但是,自适应哈希索引并不是在所有情况下都可以使用,例如:link '%xxx'。这是因为百分号前导的链接查询本身需要全表扫描,所以使用 不加索引结果是一样的,但是索引的使用是不必要的,所以这种情况下不需要创建自适应哈希索引。

2。缓冲存储

缓冲存储(中文名:缓冲存储)是MySQL数据库最重要的部分。数据库启动时,首先初始化该内存区域,占用MySQL数据库总内存空间的80%以上。详细可以查看show engine innodb status\G

mysql> show engine innodb status\G
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 301572
Buffer pool size   8191
Free buffers       6916
Database pages     1252
Old database pages 442
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 258, not young 1
0.00 youngs/s, 0.00 non-youngs/s
Pages read 320, created 938, written 3279
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 1252, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
复制代码

它的主要作用是提高数据库查询的效率,其中是主要使用的算法,我们以仔细看看 LRU 算法。在

MySQL 数据库InnoDB 存储引擎的底层逻辑架构

MySQL数据库中,LRU算法的底层主要是链表。但链表分为两个区域,即新子链表和旧子链表,新子链表占用总空间的5/8,旧链表占用总空间的3/。 8。实现的主要步骤如下:

MySQL 数据库InnoDB 存储引擎的底层逻辑架构

  • 第1步:假设我们读取数据2。目前,data 2恰好位于新的子链接列表中。目前,数据2已更改为新链表的开头。
  • 步骤2:如果查询的数据不在缓冲池中,MySQLMySQL磁盘会从数据库中读取数据,并添加到新链表,旧链表中的信息N被删除。

说到这里,有的朋友可能会问,既然新的数据移到了链表的前面,后面的数据直接删除了,那为什么还需要一个新的链表和一个旧的子链表呢? ?

这次让我们想象一下。假设我们查询的数据量比较大,会占用整个缓冲池内存空间。我们了解到,根据删除策略,所有数据都会被一次性删除。所有数据都将被删除。目前高速数据库将所有查询都放到磁盘上,导致系统磁盘IO急剧增加,数据库响应缓慢,最终导致用户体验下降。

我们来看看这个时候。如果新检索的数据全部存储在新的子链表中,则查询到的数据最多会填满新的子链表中的所有空间,而旧的子链表仍会保存之前的数据。在快速运行的数据库中,不会造成系统磁盘IO急剧增加,拖慢数据库的响应。这也是新旧链表设计的初衷。

缓冲存储还预留了一个小内存块,即更改缓冲区。现在我们来说说这个内存是用来做什么的。

3。更改缓冲区

更改缓冲区 另一个名称是“写入缓存”。顾名思义,更改缓冲区的主要功能是将数据编辑操作的结果存储在数据库中。主要目的是提高数据库写入性能

我们来详细分析一下数据编辑的各个阶段。

  • 第一步:编辑数据时,首先判断缓冲池中是否存在该数据。
    • 如果是,直接在缓冲存储器中编辑信息。如果
    • 不存在,则先从磁盘中读取Change buffer中的数据,然后从日志中编辑Change buffer中的数据,同时写入。 (防止数据丢失),下次查询数据时,会与缓冲存储合并。
  • 第二步:Change Buffer中的数据编辑完成后,何时合并数据?
    • 第一种方法:当询问编辑数据时,将其与缓冲存储合并。
    • 第二种方法:主线程连接MySQL数据库(默认时间:10秒)。
    • 第三种方式:当MySQL数据库关闭时,用Redo Log连接到磁盘。

Change Buffer这样设计是因为对于快速的MySQL数据库来说,如果每次更改都会修改磁盘,同时也会修改Buffer Pool,即MySQL数据库的内容。价格太高,磁盘IO很高,最终会让MySQL数据库运行缓慢。那么使用Change buffer修改数据就相当于修改了

内存中的数据并保存到内存中。当数据库空闲时,它被写入磁盘,以便可以对其进行更改。数据意图还可以降低数据库对系统性能的要求,从而提高数据库性能。 ️ 。

4。日志缓冲区

我们想象一下,如果在更改缓冲区中编辑后才将数据保存到内存中,那么如果数据库当前已经消失,则意味着我们刚刚编辑过。数据也会立即丢失,这是不允许的。

如何解决这个问题? MySQL为我们提供了日志记录的解决方案,即编辑后的数据保存在日志中一个名为Redo Log(参见下面的Redo Log部分)的文件中。它是一个物理日志。当数据减少时,直接将数据保存到磁盘;当数据库打开时,会自动写入数据库磁盘,这样数据就不会丢失。

我们上面提到Redo Log是物理日志。如果大量数据直接写入磁盘,仍然会降低数据库的性能。我们使用日志缓冲区将要写入的数据保存到重做日志,有助于提高数据库性能。

此时你可能会问:那更换缓冲区为什么不直接写入磁盘呢?

这是特殊情况。 MySQL数据库在系统盘上存储的数据是可以的(一般是根据主键ID)。如果每次数据改变都直接访问磁盘,会导致很多数据位置发生变化(也常被称为:随机IO),但是重复记录是无序的,随机IO并不开心,所以使用重复日志暂时保存数据,以确保避免数据丢失的最佳方式。说完了InnoDB存储引擎的内存架构,我们再来看看InnoDB存储引擎的磁盘架构。

磁盘架构

InnoDB存储引擎,磁盘架构中最重要的是表空间。 InnoDB存储表空间主要分为:系统表空间、独立表空间、常规表空间、Undo表空间和临时表空间。

下面详细说一下InnoDB存储引擎的磁盘架构中的各个表空间。 ?输入缓冲、更改缓存和撤消日志。

系统表空间通常存储在MySQL数据库目录中,其名称为:ibdata1。一般来说,系统表空间不一定只有一个,也可以有多个。系统表空间的大小和数量由innodb_data_file_path控制。具体如下:

mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.00 sec)
复制代码

这里特别需要注意的是,InnoDB数据库在MySQL 8.0之后与MySQL数据库合并,不再存储在系统表空间中。

此时你可能会问MySQL数据表中的数据存储在哪里?下面我们就来说说这个话题。

2。

innodb存储机的独立表空间,我们平时创建数据表时,会在MySQL数据目录下创建两个文件,即.ibd,其中有和两个文件。来自.ibd文件主要用于存储表数据,而.frm文件主要用于存储索引。

这种方式可以单独管理所有数据表,实现数据的快速传输。当数据出现故障时,还可以提高数据恢复的成功率。然而,这种方法会增加磁盘碎片,并在一定程度上影响处理表格文件时的系统性能。

3。标准表空间

标准表空间的核心实际上是共享表空间。该文件是MySQL数据库数据目录下以.ibd结尾的文件。与系统表空间一样,它支持MySQL数据库中所有数据表的结构。它将一些数据库元数据存储在内存中,减少独立表空间的内存消耗。

4。 Undo 表空间

Undo 表空间主要用于存储undo 日志(即:Undo 日志)。默认存放在MySQL数据库的根目录下。我们可以通过以下方式查看:

mysql> SHOW VARIABLES LIKE 'innodb_undo_directory';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_undo_directory    | ./    |
+--------------------------+-------+
4 rows in set (0.00 sec)
复制代码

MySQL 8.0版本之后,在MySQL数据库数据根目录1❝‷‷中创建了undo表空间。 undo002 总共有两个文件。

5。临时表空间

临时表空间主要用于存储数据库会话中的临时数据。将名为 ibtmp1 的文件保存在 MySQL 数据库的根目录中。最重要的是,当我们在查询中使用联接时,我们会在临时表空间中创建一个临时数据表来帮助查询。临时表空间的配置可以如下查看:

mysql> SELECT @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend        |
+------------------------------+
1 row in set (0.00 sec)
复制代码

总结

InnoDB存储引擎是MySQL数据库中最重要的存储引擎之一。今天我们通过它的内存和磁盘架构来深入了解它的底层架构。

内存架构中,自适应哈希索引有助于提高查询速度; 缓冲存储主要提供内存储备,用于在内存中存储频繁请求的信息,这对于提高数据库性能很有用。查询性能,减少系统磁盘IO; 更改缓冲区主要将修改后的数据存储在内存中,并在下次查询时将其与缓冲池合并。这样做的好处是可以减少修改数据时的磁盘IO,从而提高数据库性能; 日志缓冲区会将所有编辑的数据保存在其中,然后将其写入重做到日志以防止数据丢失。

在磁盘架构中,系统表空间用于编辑和撤消日志。之前的数据库版本还有InnoDB字典和双写缓冲区;独立表空间主要用于存储表数据和索引驻留的地方;标准表空间是共享表空间,可以减少独立表空间的内存消耗; undo表空间主要用于事务回滚,用于存储未提交使用之前的原始数据。当事务被取消时,编辑的数据将替换为撤消表空间的内容。返回;临时表空间主要是一个过渡表空间,一些常见的操作需要这个过渡来辅助操作。例如,连接表查询。

从内存架构到磁盘架构InnoDB存储引擎为我们提供了高效且高度保护的数据库存储引擎。通常,在实际的搜索过程中,InnoDB存储引擎是我们首选的存储引擎,但是在使用过程中,缓冲区预留空间必须设置得足够大,这有助于提高性能数据查询性能。 。

作者:NPy

来源:稀土矿块

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门