首页 > 数据库 >MySQL InnoDB引擎架构

MySQL InnoDB引擎架构

时间:2024-01-29 11:48:36浏览次数:34  
标签:架构 log Buffer 索引 InnoDB MySQL 磁盘 日志

逻辑存储结构:

  • 表空间(ibd文件):一个mysql实例可以对应多个表空间,用于存储记录,索引等数据。
  • 段:分为数据段(Leaf node segment),索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点,索引段即为B+树的非叶子节点。段用来管理多个Extent(区)。
  • 区:表空间的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎页大小为16K,即一个区中一共有64个连续的页。
  • 页:是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区。
  • 行:InnoDB 存储引擎数据是按行进行存放的。(Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列;Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。)

架构

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

内存架构

Buffer Pool

 缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘I0,加快处理速度。

缓冲池以Page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型:

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

 

 

Change Buffer

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

Change Buffer的意义是什么?

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

 

Adaptive Hash Index

自适应hash索引,用于优化对Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,则建立hash索引,称之为自适应hash索引。

自适应哈希索引,无需人工干预,是系统根据情况自动完成。参数:adaptive_hash_index

 

 

Log Buffer

日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log 、undo log),默认大小为16MB,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘I/O。

参数:

  • innodb log buffer size:缓冲区大小
  • innodb_flush_log_at_trx_commit:日志刷新到磁盘时机(1:日志在每次事务提交时写入并刷新到磁盘;0:每秒将日志写入并刷新到磁盘一次;2:日志在每次事务提交后写入,并每秒刷新到磁盘一次)

架构-磁盘结构

General Tablespaces:通用表空间,需要通过CREATE TABLESPACE语法创建通用表空间,在创建表时,可以指定该表空间。

CREATE TABLESPACE XXX ADD DATAFILE 'file name' ENGNE=engine_name;

CREATE TABLE XXX... TABLESPACE ts_name;

Undo Tablespaces:撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志 。

Temporary Tablespaces:InnoDB使用会话临时表空间和全局临时表空间、存储用户创建的临时表等数据。

 

Doublewrite Buffer Files:双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先

将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。

#ib_16384 0.dblwT

#ib_16384_1.dblwt

Redo Log:重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中,用于在刷新脏页到磁盘时,发生错误时,进行数据恢复使用。

以循环方式写入重做日志文件,涉及两个文件:ib_logfile0

ib_logile1

 

 

 

 

架构-后台线程

1. Master Thread

核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收。

I0 Thread

在InnoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大地提高数据库的性能,而IO Thread主要负责这些IO请求的回调。

 

3. Purge Thread

主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收。

4. Page Cleaner Thread

协助 Master Thread 刷新脏页到磁盘的线程。它可以减轻Master Thread的工作压力,减少阻塞。

 

标签:架构,log,Buffer,索引,InnoDB,MySQL,磁盘,日志
From: https://www.cnblogs.com/roujingchuxia/p/17994147

相关文章

  • mysql锁
    锁分类读锁(共享锁)写锁(排他锁)按照锁的粒度划分全局锁锁整个数据库,一般用于数据迁移、数据备份表锁一般用于altertable、droptable、truncktable、locktable行所select...forudpate、insert、update、delete间隙锁select...fromstudentwhereid>=10and......
  • Windows 安装 MySQL 5.8 -- 输入3次 密码错误锁定账户
    安装下载地址:https://downloads.mysql.com/archives/installer/需要有.netframework4.5.2及以上版本才能安装MySQL5.8选择自定义安装选择要安装的服务修改安装路径设置ROOT密码,测试错误锁定帐号MySQL8.0.19版本之后,新增了一个功能,支持了输入3次......
  • Linux环境安装MYSQL
    一、卸载MariaDB##查看是否安装rpm-qa|grepmariadb##卸载rpm-e--nodepsmariadb-libs 二、资源包准备2.1官网下载https://dev.mysql.com/downloads/mysql/ 2.2上传安装包,并解压#.tar.gz后缀:tar-zxvf文件名#.tar.xz后缀:tar-Jxvf文件名tar-xvf......
  • 【Lazy ORM 整合druid 实现mysql监控】
    LazyORM整合druid实现mysql监控JDK17LazyORM框架地址up、up欢迎start、issues当前项目案例地址框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy-ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-spring-boo......
  • Dubbo 架构演进:从 RMI 到 Dubbo
    目录Dubbo架构演进:从RMI到Dubbo1.自定义RPC2.RMI架构2.1整体架构2.2RPC调用3.Dubbo架构3.1整体架构3.2RPC调用3.3服务治理4.总结时刻推荐阅读 谈谈你对Dubbo的认知?对于这个问题,你是怎么回答的呢?我们知道Dubbo是从RPC起家,......
  • MySQL数据库连接报错1130 - Host 'xxx' is not allowed to connect to this MySQL ser
    目录现象描述原因分析解决办法:本文解决MySQL数据库连接报错1130-Host'xxx'isnotallowedtoconnecttothisMySQLserver。返回目录返回目录现象描述MySQL数据库,使用Navicat、root用户连接报错:原因分析这个报错原因是权限问题,需要修改连接权限。进入mysql......
  • MySQL查看默认密码和修改密码
    目录查看默认密码1.查找日志目录2.vim查看3.搜索password关键字修改密码1.使用默认密码登陆2.修改密码3.立即生效查看默认密码1.查找日志目录find/-namemysqld.log2.vim查看3.搜索password关键字修改密码1.使用默认密码登陆2.修改密码......
  • 【亲测管用】Linux环境下MySQL 8.0重置密码
    这个问题折磨了我有两三个小时了,看了一大堆博客,大多数都不好用,真的怀疑有没有亲自试用过。本文使用的服务器为阿里云的服务器Linux系统,MySQL的版本为8.0。修改密码操作如下,供大家参考:在/etc/my.cnf中添加如下代码,使其支持免密登录[mysqld]skip-grant-tables重启MySQL服......
  • Unity架构师进阶:红点系统的架构与设计
    面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统,有哪些接口,并完整地给出实现。红点系统的需求分析首先我们来分析一下红点系统的设计需求:红点系统严格意义上来说不属于框架,而是游戏逻辑,所以代码不要放到通用的框架里面,并不属于基础服务。它......
  • MySQL必知必会 pdf下载
    《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握......