MySQL高级10-InnoDB引擎存储架构

这篇具有很好参考价值的文章主要介绍了MySQL高级10-InnoDB引擎存储架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、逻辑存储结构

  MySQL高级10-InnoDB引擎存储架构

  表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据。

  MySQL高级10-InnoDB引擎存储架构

  段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点(Leaf node segment),索引段即为B+树的非叶子节点(Non-leaf node segment)。段用来管理多个Extent(区)。

  MySQL高级10-InnoDB引擎存储架构

 文章来源地址https://www.toymoban.com/news/detail-709919.html

  区(Extent):表空间的单元结构,每个区的大小为1M, 默认情况下,InnoDB存储引擎页大小为16k,即一个区中一共有64个连续的页

  页(Page):页是InnoDB存储引擎磁盘管理的最小单元,每个页大小默认为16K,为了保证页的连续,InnoDB存储引擎每次从磁盘申请4-5个区

  行(Row):InnoDB存储引擎数据是按行进行存放的,Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给这个trx_id隐藏列。Roll_pointer:每次对某条记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,通过它可以找到该记录修改前的信息

 

二、整体架构

  MySQL5.5 版本开始,默认使用 InnoDB 存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛,下面是 InnoDB 架构图,左侧为内存架构,右侧为磁盘架构。 

  MySQL高级10-InnoDB引擎存储架构

 

 

三、内存结构

  MySQL高级10-InnoDB引擎存储架构 

  内存架构中主要分为:Buffer Poll(内存缓冲池)、Change Buffer()、LogBuffer()、Adaptive Hash Index()四个区。

  3.1 Buffer Pool

    缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据,若缓冲池没有数据,则从磁盘加载并缓存,然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快出来速度。缓冲池以Page页为单位,底层采用链表数据结构管理Page,根据状态可以将Page分为三种类型。

    • free page:空闲Page,未被使用。
    • clean page:被使用page,数据没有被修改过。
    • dirty page:脏页,被使用page,数据被修改过,其中数据与磁盘上的数据产生了不一致。

  3.2 Change Buffer

    更改缓冲区,针对与非唯一二级索引页,在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而是将数据变更存在更改缓冲区Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再讲合并后的数据刷新到磁盘中。

    Change Buffer的意义:与集聚索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引,同样,删除和更新都可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO,有了Change Buffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO

  MySQL高级10-InnoDB引擎存储架构

  3.3 Adaptive Hash index

    自适应hash索引,InnoDB默认是不支持hash索引的,默认支持的是B+树的索引。因为hash索引不支持范围查找,仅可以用来做值匹配查找。但是自适应hash索引,用于优化对Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各项索引页的查询,如果观察到hash索引可以提升速度,则建立hash索引,称之为自适应hash索引。

    自适应哈希索引,无需人工干预,是系统根据情况自动完成。通过 innodb_adaptive_hash_index 参数可以配置自适应hash索引的开启和关闭。 

mysql> show variables like "%innodb_adaptive_hash_index%";
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| innodb_adaptive_hash_index       | ON    |
| innodb_adaptive_hash_index_parts | 8     |
+----------------------------------+-------+
2 rows in set (0.00 sec)

  3.4 Log Buffer

    日志缓冲区,用来保存要写入到磁盘中的log日志(redolog,undolog),默认大小为16M, 日志缓冲区的日志会定期刷新到磁盘中,如果需要更新、插入或者删除许多行的事务,增加日志缓冲区的大小可以节省磁盘i/o

    通过 innodb_log_buffer_size 参数可以查看缓冲区大小

    通过 innodb_flush_log_at_trx_commit 参数可以查看刷新到磁盘时机。这里有0,1,2三个值:

      • 0:每秒将日志写入并刷新到磁盘一次。
      • 1:日志在每次事务提交时写入并刷新到磁盘。
      • 2:日志在每次事务提交后写入,并每秒刷新到磁盘一次。
mysql> show variables like "innodb_log_buffer_size";
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)

mysql>   show variables like "%flush_log%";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout    | 1     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
2 rows in set (0.00 sec)

 

四、磁盘架构  

  MySQL高级10-InnoDB引擎存储架构 

  4.1 System Tablespace  

    在MySQL中,System Tablespace(系统表空间)是一个用于存储系统表和一些特殊表的默认表空间。系统表空间包含了以下几个重要的系统表:

    • mysql.user:存储了MySQL中的用户和权限信息。
    • mysql.db:存储了所有数据库的信息。
    • mysql.host:存储了允许连接到MySQL服务器的主机信息。
    • mysql.tables_priv:存储了表级别的权限信息。
    • mysql.columns_priv:存储了列级别的权限信息。

    系统表空间还包含其他系统表,用于存储MySQL服务器的配置和元数据信息。
    系统表空间默认存储在名为`ibdata1`的共享文件中。这个文件通常位于MySQL的数据目录下。

    MySQL高级10-InnoDB引擎存储架构

    要注意的是,在InnoDB存储引擎中,除了系统表空间(System Tablespace),还存在一个叫做表空间文件(Tablespaces)的概念。表空间文件用于存储用户创建的表和索引。每个InnoDB表都会有一个对应的表空间文件。
    需要注意的是,有时候系统表空间的大小会超过预期,导致空间不足或性能问题。在这种情况下,可以考虑调整系统表空间的大小或进行其他优化措施以解决问题。
    总结:系统表空间是MySQL中用于存储系统表和特殊表的默认表空间,包含了一些重要的系统表,通常存储在名为`ibdata1`的共享文件中。

  4.2 File-Per-Table Tablespace

    MySQL高级10-InnoDB引擎存储架构

    File-Per-Table Tablespace(每个表一个表空间)是MySQL中的一个存储配置选项,它允许每个InnoDB表使用单独的表空间文件来存储数据和索引。这与默认情况下的系统表空间不同。

    在默认情况下,所有的InnoDB表共享一个系统表空间,即存储在ibdata1文件中。而使用File-Per-Table Tablespace选项,每个InnoDB表都会有一个独立的表空间文件,位于数据目录下。

    File-Per-Table Tablespace的优点包括:

    • 管理:每个表有自己的表空间文件,方便管理和维护。可以更方便地备份、恢复或迁移单个表。
    • 性能:每个表具有独立的表空间文件,可以在磁盘上更好地分布和组织数据,提高性能和并发访问的能力。
    • 存储空间:使用File-Per-Table Tablespace可以更有效地使用存储空间。当有大量小表或经常进行删除和重建表时,每个表的表空间文件可以更好地管理空间,避免系统表空间的不断增长。

    File-Per-Table Tablespace的缺点和注意事项包括:

    • 管理复杂性:每个表都会有一个独立的表空间文件,这可能增加了管理的复杂性,包括备份和维护的管理操作。
    • 存储和文件系统:使用File-Per-Table Tablespace可能涉及更多的磁盘IO操作,并可能增加文件系统的碎片化问题。

    使用File-Per-Table Tablespace可以在创建表时进行配置或在现有表上进行更改。要在创建新表时启用File-Per-Table Tablespace,可以在创建表的DDL语句中加上ENGINE=InnoDB选项。要在已有表上启用File-Per-Table Tablespace,可以使用MySQL的ALTER TABLE语句并设置innodb_file_per_table参数为ON。

    总结:File-Per-Table Tablespace是MySQL InnoDB存储引擎的一个选项,允许每个表使用单独的表空间文件存储数据和索引。它提供了更灵活的管理、更好的性能和更高效的存储空间利用率

  4.3 General Tablespaces

    General Tablespaces(通用表空间)是MySQL 5.7版本引入的一个功能,在InnoDB存储引擎中提供了更灵活和更高级的表空间管理选项。 

    通用表空间允许将多个InnoDB表存储在一个或多个共享表空间文件中,而不是每个表都有自己的独立表空间文件(如File-Per-Table Tablespace中)。这些共享表空间文件可以在运行时动态添加或删除新的表。

    通用表空间的优点包括:

    • 简化管理:使用通用表空间可以更方便地管理和维护多个表。可以将相关的表组织在同一个共享表空间中,便于备份、恢复和迁移。
    • 空间效率:通用表空间可以更有效地使用存储空间。多个表可以共享一个表空间文件,避免了为每个表都创建单独的表空间文件的开销。
    • 高性能:由于多个表共享表空间文件,可以提高磁盘IO操作的效率。此外,共享表空间可以利用预读机制(预读相邻页)来提高查询性能。

     使用通用表空间时,可以在创建表时指定TABLESPACE子句来为表分配到指定的共享表空间,也可以使用ALTER TABLE语句将现有表移动到共享表空间中。

     创建通用表空间示例:

mysql> create tablespace my_test add datafile "my_test.ibd" engine=InnoDB;
Query OK, 0 rows affected (0.01 sec)

    MySQL高级10-InnoDB引擎存储架构

     创建使用通用表空间的表示例:

mysql> create table tablespace_test(id int) tablespace my_test;
Query OK, 0 rows affected (0.03 sec)

    说明1:此时MySQL就不会再给tablespace_test表创建单独的表空间了,而是使用通用表空间my_test.ibd空间

    将现有表移动到通用表空间语法示例:

ALTER TABLE table_name TABLESPACE tablespace_name;

    说明2:`table_name`是要移动的表的名称,`tablespace_name`是要移动到的表空间的名称。    

    删除通用表空间语法示例

ALTER TABLESPACE tablespace_name DROP DATAFILE '<path>/tablespace_file.ibd';

    说明3:`tablespace_name`是要删除的表空间的名称,`<path>/tablespace_file.ibd`是要删除的表空间文件的路径和文件名。

  4.4 undo Tablespace

    在MySQL中,"undo tablespace"(撤销表空间)是用于存储撤销日志数据的一种特殊类型的表空间。

    撤销日志是 MySQL 中的一项重要功能,用于回滚或撤销事务中所做的更改。当事务执行 UPDATE、DELETE 或 INSERT 操作时,撤销日志记录了被修改或删除的非聚集索引的旧值,以及 INSERT 操作插入的新记录。这些撤销日志记录存储在名为 "undo log" 的数据结构中。

    为了高效地管理和存储撤销日志数据,MySQL引入了 "undo tablespace" 的概念。撤销表空间是一个独立于数据表空间的区域,用于存储撤销日志数据。它可以包含一个或多个文件,这些文件具有固定大小(通常是小于等于1GB)和特定的命名约定,默认的是undo_001和undo_002

    MySQL高级10-InnoDB引擎存储架构

    撤销表空间的主要作用有以下几个方面:

    • 提供事务的回滚能力:如果一个事务需要回滚,MySQL可以使用撤销表空间中的撤销日志来还原事务执行前的数据状态。
    • 支持并发事务:撤销表空间使得多个事务可以同时进行,并提供了事务隔离级别的支持。
    • 回收空间:当事务完成时,撤销表空间中的撤销日志可以被清除,空间可以被重复使用。

     撤销表空间在MySQL的配置文件(my.cnf或my.ini)中通过innodb_undo_directoryinnodb_undo_tablespaces配置项进行设置。innodb_undo_directory定义了撤销表空间文件的存储目录,而innodb_undo_tablespaces指定了要使用的撤销表空间文件的数量。

    总结:撤销表空间是MySQL中用于存储撤销日志数据的表空间,支持事务的回滚、并发事务和空间回收。

  4.5 Temporary Tablespace

    在MySQL中,临时表空间(Temporary Tablespace)是用于存储临时表数据和临时结果集的一种特殊类型的表空间。临时表空间的作用是存储临时表的数据,这些临时表通常是在查询过程中创建的。这些临时表可能包括临时表名、中间结果集或者用于排序和聚合的临时数据。

    默认情况下,MySQL使用系统表空间(system tablespace)来存储临时表数据。但是,在高并发环境下,使用单个系统表空间可能会导致性能瓶颈。为了提高性能并优化系统资源的使用,MySQL引入了临时表空间的概念。通过为临时表数据分配独立的临时表空间,MySQL可以更好地管理和优化临时表的创建和使用。临时表空间可以在独立的表空间文件中存储临时表数据,这些文件可以位于不同的存储设备上,从而分散了IO负载。

    可以通过以下配置项来设置临时表空间:既可以写在MySQL配置文件中也可以在MySQL交互界面上使用set 指令设置

    -`tmp_table_size`:用于设置每个临时表的内存大小。如果临时表大小超过此值,则会将其存储到临时表空间中。

    -`max_heap_table_size`:用于设置只在内存中存储的临时表的最大大小。

    -`tmpdir`:用于设置临时表空间的目录。

    使用临时表空间可以提升查询性能,减少对系统表空间的负载,并提供更好的系统扩展性和可维护性。

    总结:临时表空间是MySQL中用于存储临时表数据和临时结果集的表空间。它可以提高查询性能,并分散IO负载,提供更好的系统资源利用和扩展性。

  4.6 Doublewrite Buffer Files

    在MySQL中,Doublewrite Buffer Files(双写缓冲区文件)是一种用于提高数据保护和恢复机制的技术。Doublewrite Buffer Files使用了一种双写技术,先将数据写入到双写缓冲区文件,然后再写入到实际的数据文件。这可以减少数据损坏和页级别的IO不一致性的风险。双写缓冲区文件的主要作用是用于在MySQL崩溃或意外断电的情况下,保护InnoDB存储引擎使用的数据页的完整性。
    当InnoDB存储引擎进行写操作时,会先将数据写入到双写缓冲区文件,然后通过后台线程将数据写入到磁盘上的实际数据文件。这样,在发生崩溃或断电时,双写缓冲区中的数据可以用来恢复数据文件的一致性。双写缓冲区文件在重启MySQL时会自动应用并删除。
    双写缓冲区文件的大小由配置参数`innodb_doublewrite_buffer_size` 控制,默认值为`1MB`。可以通过在MySQL配置文件中设置该参数来修改双写缓冲区文件的大小。
    使用双写缓冲区文件的一个潜在问题是会增加写操作的IO负载,因为每个写操作都需要写入两次。为了减少双写带来的性能影响,可以考虑将双写缓冲区文件放置在快速的存储介质上,如SSD。
    总结:Doublewrite Buffer Files是一种用于提高数据保护和恢复机制的技术,通过在写入实际数据文件之前将数据先写入到双写缓冲区文件,来减少数据损坏和页级别的IO不一致性的风险。双写缓冲区文件的大小由配置参数控制,需要在MySQL配置文件中进行配置。

    MySQL高级10-InnoDB引擎存储架构

  4.7 Redo Log

    在MySQL中,Redo Log(重做日志)是用于实现事务的持久性和恢复能力的关键组件之一。它记录了发生在数据库中的数据更改操作,以确保在系统崩溃或断电时,能够将未完成的事务重新应用到数据库中,以保持数据的一致性。

    Redo Log是循环写入的,意味着当日志文件写满后,会重新从开头开始覆盖之前的日志。所有的修改操作都会先写入到Redo Log,然后异步地刷新到磁盘上的数据文件。这样即使在写操作还未刷新到磁盘上的数据文件时发生崩溃,通过Redo Log的回放可以重新执行未完成的事务,确保数据的持久性。

    Redo Log是以逻辑方式记录的,而不是物理方式。它记录了事务引起的数据修改,而不是实际的数据变化。通过记录这些逻辑操作,MySQL可以在恢复时重新执行所需的操作。

    在MySQL中,Redo Log由两个文件组成,通常为`ib_logfile0`和`ib_logfile1`。这些文件的大小由配置参数`innodb_log_file_size`控制,默认情况下为`48MB`。可以在MySQL配置文件中进行修改。

    使用Redo Log的一个重要注意事项是,写入Redo Log会引起磁盘IO操作,因此对于事务密集型负载,合理调整Redo Log的大小和I/O性能是很重要的。过小的Redo Log可能导致频繁的刷新和IO延迟,而过大的Redo Log可能对内存和磁盘空间带来负担。

    总结:Redo Log是MySQL中用于实现事务的持久性和恢复的关键组件,它记录了数据的修改操作,保证在系统崩溃或断电后,能够重新应用未完成的事务。Redo Log由两个文件组成,通过循环写入的方式记录数据修改。合理调整Redo Log的大小和I/O性能对于数据库性能和持久性是重要的。

    MySQL高级10-InnoDB引擎存储架构

 

 

到了这里,关于MySQL高级10-InnoDB引擎存储架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • InnoDB引擎底层逻辑讲解——架构之磁盘架构

    系统表空间是change buffer(更改缓冲区)的存放区域,这是在8.0之后重新规划的,在5.x版本的时候,系统表空间还会存放innodb的数据字典undolog日志等信息,在8.0之后主要主要存放更改缓冲区的数据。如果innodb引擎当中,每一张表的独立表空间关闭着的话,那么所有的表的数据

    2024年02月14日
    浏览(40)
  • InnoDB引擎底层逻辑讲解——架构之内存架构

    下图为InnoDB架构图,左侧为内存结构,右侧为磁盘结构。 2.1 Buffer Pool缓冲池 2.2 Change Buffer更改缓冲区 2.3 Adaptive Hash Index自适应hash索引 查看自适应hash索引是否开启: 2.4 Log Buffer日志缓冲区 查看日志缓冲区的大小: 查看日志缓冲区刷新时机:

    2024年02月15日
    浏览(45)
  • MySQL—MySQL的存储引擎之InnoDB

    存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用 Me

    2024年04月26日
    浏览(44)
  • 谈谈MySQL的InnoDB存储引擎

    大家好,我是易安! 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包

    2024年02月03日
    浏览(43)
  • MySQL 的 InnoDB 存储引擎简介

    MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理

    2024年02月08日
    浏览(49)
  • 【MYSQL】存储引擎MyISAM和InnoDB

    查看MySQL提供所有的存储引擎 mysql show engines; mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE 1、MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎 2、Innod

    2024年01月18日
    浏览(44)
  • Mysql进阶- InnoDB引擎架构

    InnoDB的逻辑存储结构如下图所示:  1). 表空间 是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数      innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间, 用于存储记录、索引等数据 。 2).   段 ,分为

    2024年02月04日
    浏览(47)
  • 【MySQL】 深入了解InnoDB存储引擎的限制

    目录 列数限制 索引数限制 InnoDB的行格式和索引限制 示例和注意事项 **页大小对索引键前缀长度的影响 **对全列索引键的限制 多列索引限制 行大小限制 InnoDB log限制 表空间大小限制 表数量限制 操作系统限制 文件大小和日志文件大小 文件层级限制 随着数据库技术的不断发

    2024年01月24日
    浏览(50)
  • MySQL存储引擎InnoDB和MyISAM的区别?

    InnoDB和MyISAM是MySQL数据库两种常见的存储引擎,它们在性能、事务支持等方面有一些重要的区别。以下是它们的一些主要区别: 事务支持: InnoDB: 支持事务,具有ACID(原子性、一致性、隔离性、持久性)特性,适用于需要事务支持的应用,如银行、电商等。 MyISAM: 不支持

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包