- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据.
段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点(Leaf node segment),索引段即为B+树的非叶子节点(Non-leaf node segment)。段用来管理多个Extent(区).
。
区(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 架构图,左侧为内存架构,右侧为磁盘架构。 。
。
。
。
内存架构中主要分为:Buffer Poll(内存缓冲池)、Change Buffer()、LogBuffer()、Adaptive Hash Index()四个区.
缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据,若缓冲池没有数据,则从磁盘加载并缓存,然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快出来速度。缓冲池以Page页为单位,底层采用链表数据结构管理Page,根据状态可以将Page分为三种类型.
更改缓冲区,针对与非唯一二级索引页,在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而是将数据变更存在更改缓冲区Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再讲合并后的数据刷新到磁盘中.
Change Buffer的意义:与集聚索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引,同样,删除和更新都可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO,有了Change Buffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO 。
自适应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)
日志缓冲区,用来保存要写入到磁盘中的log日志(redolog,undolog),默认大小为16M, 日志缓冲区的日志会定期刷新到磁盘中,如果需要更新、插入或者删除许多行的事务,增加日志缓冲区的大小可以节省磁盘i/o 。
通过 innodb_log_buffer_size 参数可以查看缓冲区大小 。
通过 innodb_flush_log_at_trx_commit 参数可以查看刷新到磁盘时机。这里有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中,System Tablespace(系统表空间)是一个用于存储系统表和一些特殊表的默认表空间。系统表空间包含了以下几个重要的系统表:
系统表空间还包含其他系统表,用于存储MySQL服务器的配置和元数据信息。 系统表空间默认存储在名为`ibdata1`的共享文件中。这个文件通常位于MySQL的数据目录下.
要注意的是,在InnoDB存储引擎中,除了系统表空间(System Tablespace),还存在一个叫做表空间文件(Tablespaces)的概念。表空间文件用于存储用户创建的表和索引。每个InnoDB表都会有一个对应的表空间文件。 需要注意的是,有时候系统表空间的大小会超过预期,导致空间不足或性能问题。在这种情况下,可以考虑调整系统表空间的大小或进行其他优化措施以解决问题。 总结:系统表空间是MySQL中用于存储系统表和特殊表的默认表空间,包含了一些重要的系统表,通常存储在名为`ibdata1`的共享文件中.
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,可以在创建表的DDL语句中加上 ENGINE=InnoDB 选项。要在已有表上启用File-Per-Table Tablespace,可以使用MySQL的 ALTER TABLE 语句并设置 innodb_file_per_table 参数为ON.
总结:File-Per-Table Tablespace是MySQL InnoDB存储引擎的一个选项,允许每个表使用单独的表空间文件存储数据和索引。它提供了更灵活的管理、更好的性能和更高效的存储空间利用率 。
General Tablespaces(通用表空间)是MySQL 5.7版本引入的一个功能,在InnoDB存储引擎中提供了更灵活和更高级的表空间管理选项。 。
通用表空间允许将多个InnoDB表存储在一个或多个共享表空间文件中,而不是每个表都有自己的独立表空间文件(如File-Per-Table Tablespace中)。这些共享表空间文件可以在运行时动态添加或删除新的表.
通用表空间的优点包括:
使用通用表空间时,可以在创建表时指定 TABLESPACE 子句来为表分配到指定的共享表空间,也可以使用 ALTER TABLE 语句将现有表移动到共享表空间中.
创建通用表空间示例:
mysql > create tablespace my_test add datafile "my_test.ibd" engine = InnoDB; Query OK, 0 rows affected ( 0.01 sec)
创建使用通用表空间的表示例:
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`是要删除的表空间文件的路径和文件名.
在MySQL中,"undo tablespace"(撤销表空间)是用于存储撤销日志数据的一种特殊类型的表空间.
撤销日志是 MySQL 中的一项重要功能,用于回滚或撤销事务中所做的更改。当事务执行 UPDATE、DELETE 或 INSERT 操作时,撤销日志记录了被修改或删除的非聚集索引的旧值,以及 INSERT 操作插入的新记录。这些撤销日志记录存储在名为 "undo log" 的数据结构中.
为了高效地管理和存储撤销日志数据,MySQL引入了 "undo tablespace" 的概念。撤销表空间是一个独立于数据表空间的区域,用于存储撤销日志数据。它可以包含一个或多个文件,这些文件具有固定大小(通常是小于等于1GB)和特定的命名约定,默认的是undo_001和undo_002 。
撤销表空间的主要作用有以下几个方面:
撤销表空间在MySQL的配置文件(my.cnf或my.ini)中通过 innodb_undo_directory 和 innodb_undo_tablespaces 配置项进行设置。 innodb_undo_directory 定义了撤销表空间文件的存储目录,而 innodb_undo_tablespaces 指定了要使用的撤销表空间文件的数量.
总结:撤销表空间是MySQL中用于存储撤销日志数据的表空间,支持事务的回滚、并发事务和空间回收.
在MySQL中,临时表空间(Temporary Tablespace)是用于存储临时表数据和临时结果集的一种特殊类型的表空间。临时表空间的作用是存储临时表的数据,这些临时表通常是在查询过程中创建的。这些临时表可能包括临时表名、中间结果集或者用于排序和聚合的临时数据.
默认情况下,MySQL使用系统表空间(system tablespace)来存储临时表数据。但是,在高并发环境下,使用单个系统表空间可能会导致性能瓶颈。为了提高性能并优化系统资源的使用,MySQL引入了临时表空间的概念。通过为临时表数据分配独立的临时表空间,MySQL可以更好地管理和优化临时表的创建和使用。临时表空间可以在独立的表空间文件中存储临时表数据,这些文件可以位于不同的存储设备上,从而分散了IO负载.
可以通过以下配置项来设置临时表空间:既可以写在MySQL配置文件中也可以在MySQL交互界面上使用set 指令设置 。
-`tmp_table_size`:用于设置每个临时表的内存大小。如果临时表大小超过此值,则会将其存储到临时表空间中.
-`max_heap_table_size`:用于设置只在内存中存储的临时表的最大大小.
-`tmpdir`:用于设置临时表空间的目录.
使用临时表空间可以提升查询性能,减少对系统表空间的负载,并提供更好的系统扩展性和可维护性.
总结:临时表空间是MySQL中用于存储临时表数据和临时结果集的表空间。它可以提高查询性能,并分散IO负载,提供更好的系统资源利用和扩展性.
在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引擎存储架构的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经在我的 windows7 机器上安装了 bugzilla4.2.5。当我运行 bugzilla 的 checksetup.pl 脚本时,它显示 Use of uninitialized valu
我正在使用 MySQL 5.1.56 我有一个包含大约 70 个表的数据库,我有一个特定损坏的表的问题,例如表_X 当我尝试访问表时mysql> 从 Table_x 中选择 *;ERROR 1105
我最近尝试将 MySQL 5.1 服务器升级到 5.7。当服务器无法启动时,我发现您必须先导出数据,然后再进行大量升级(二进制文件不再可用),所以我回滚到 5.1 进行导出。 问题是,回到 5.1,I
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我最近尝试将 innodb 缓冲池大小增加到 8GB,但在我的 innodb 状态下,池大小看起来像之前配置的值(在我的例子中是 500MB)。 ---------------------- BUFF
我是一家网络酒店的幸运老板,店主会在不知情的情况下更改设置。当这么说时,我的数据库中有一些表正在使用 InnoDB 引擎运行。但是晚上主机禁用了 InnoDB,所以我无法使用 ALTER 命令将其转换
我刚刚将数据库从 MyISAM 引擎迁移到 InnoDB。我使用 mysqldump 备份我的 MyISAM 数据库,但是当我查看 MySQL docs ,对于 InnoDB 表,我还需要保存二进制文
环境: Windows 7(XAMPP 最新版) Apache 2.4.4PHP 5.5MySQL 5.6.11 我正在尝试从 MySQL 5.1 备份数据库并将其导入 MySQL 5.6。 在 My
我正在创建的应用程序主要使用选择,但也有一些是插入、更新等。我想知道在这些情况下哪种性能最好。 其次,当我在 innodb 中有两个相关的表时,如果它与另一个表中的行相关,我该如何删除它而不吐出错误?
我的意思是页面: https://dev.mysql.com/doc/internals/en/innodb-page-structure.html 这些 16KB 的 MySQL 页面会在内存或磁盘
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我阅读了本网站上的大部分 InnoDB 示例,但我对 InnoDB 的行为一无所知。 据我所知 START TRANSACTION; 声明这是一个事务连接。没关系到这里。现在我有 3 个表: 带有 I
我有一个包含混合表(MyISAM、InnoDB)的 MySQL 数据库。 如何通过 Linux 命令行使用 mysqldump 创建数据库的完整备份,我应该使用什么选项? 最佳答案 在下面使用- 所有
我有一张桌子:。我用Python在这个表中插入了大约400k行。以下是INSERT语句:。我在两个表tab1.col1和tab2.col2上都有一个索引。但是插入大约需要5分钟/1000行的时间。我从
我正在尝试使用 WAMP 在本地服务器上安装 Magento。 InnoDB 被设置为默认引擎,但它仍然向我显示消息: Database server does not support InnoDB
我最近将所有表从 MyISAM 移到了 InnoDB,因为我想摆脱大表上的表锁定。 在以下表上运行 UPDATE 或 INSERT 查询花费的时间比预期的要多很多。 (约 5 分钟) 我如何优化 in
我正在运行带有 XAMPP 的 Windows 10 和在本地主机上安装的几十个 Drupal 站点。几个月来一切都运行良好。 今天早上,我从两天前的还原点执行了 Windows 还原,以删除不需要的
Socialengine 4.8.6 - 启动时显示“白屏”,只能通过浏览器访问 sesystem.com/phpmyadmin 和 sesystem.com/install。 问题开始:我需要一个包
由于 InnoDB 在 B+ 树中组织其数据。树的高度影响 IO 次数,这可能是 DB 变慢的主要原因之一。 所以我的问题是如何断言或计算B+树的高度(例如根据可以通过行大小、页面大小和行号计算的页数
我尝试使用 mysqldump 从系统 A 使用 innodb 默认存储引擎将大约 40gb 的数据库 db1 转储到 sql 文件中,并尝试在另一个系统 B 上恢复它。两者都有默认存储引擎 inno
我是一名优秀的程序员,十分优秀!