# MySQL InnoDB引擎 逻辑存储引擎 架构 概述 内存架构 磁盘结构 后台线程 事务原理 事务基础 redo log undo log MVCC 基本概念 隐藏字段 undolog readview 原理分析 # 逻辑存储引擎 InnoDB的逻辑存储结构如下图所示: 表空间 表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在8.0版本中默认开启 默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页。 页 页,是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。 为了保证页的连续性,InnoDB 存储引擎每次从磁盘申请 4-5 个区。 行 行,InnoDB 存储引擎数据是按行进行存放的。 我们知道,在InnoDB引擎中的内存结构中,主要的内存区域就是缓冲池,在缓冲池中缓存了很多的数据页。
一、InnoDB 体系架构 ? InnoDB 存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构。 通过 SHOW ENGINE INNODB STATUS 可以观察到 INNODB 存储引擎的运行情况。 SHOW ENGINE INNODB STATUS 二、内存池 ? IO Thread 的工作主要是负责 IO 请求的回调处理(InnoDB 存储引擎中大量的使用了 AIO 来处理写 IO 请求)。 在 InnoDB 存储引擎中,采用异步IO(Asynchronous IO,AIO)的方式来处理磁盘操作。 SHOW VARIABLES LIKE 'innodb_use_native_aio' InnoDB 存储引擎还提供了 Flush Neighbor Page(刷新邻接页)的特性。
undo独立表空间是innodb的一个可选项,由innodb_undo_tablespaces配置。默认情况下,该值为0,即undo数据是存储在ibdata中。 innodb中核心的数据都存放在ibdata中的系统数据页中。 当开启innodb_file_per_table时,innodb会为每一个用户表建立一个独立的ibd文件。该ibd文件存放了对应用户表的索引数据和插入缓冲bitmap。 当表中无主键时,innodb会为该表每一行分配一个唯一的rowID,并基于它构造btree。 四、文件管理过程 下面用精简后的源码来简单介绍innodb文件的管理过程。
虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储引擎相关知识。 1. InnoDB 简介 MySQL 5.5 版本以后,默认存储引擎就是 InnoDB 了。InnoDB 是一种兼顾了高可靠性和高性能的通用存储引擎。 在 MySQL 5.7 中,除非你配置了其他默认存储引擎,否则执行 CREATE TABLE 不指定 ENGINE 的语句将创建一个 InnoDB 表。 1)支持事务 InnoDB 最重要的一点就是支持事务,可以说这是 InnoDB 成为 MySQL 中最流行的存储引擎的一个非常重要的原因。 总结: 本篇文章简单介绍了 InnoDB 存储引擎及其优势,想深入学习 MySQL ,InnoDB 绝对是一块绕不开的重点知识。关于 InnoDB 的内容还有很多,后面有机会的话可以多写写。
在默认情况下,InnoDB存储引擎都有一个共享表空间ibdata1,即所有数据都存放在这个表空间内。 InnoDB存储引擎表是索引组织(index organized)的,因此数据即索引,索引即数据。 为了保证区中页的连续性,InonoDB存储引擎一次从磁盘申请4-5个区。在默认情况下,InnoDB存储引擎的页的大小为16KB,即一个区中应有64个连续的页。 (对于一些小表)1.4、页(page)页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB;InnoDB存储引擎从1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为 3、InnoDB 数据页结构 页是 InnoDB 存储引擎管理数据库最小磁盘单位。页类型为 B-tree Node 的页存放的即是表中行的实际数据了。
InnoDB存储引擎文件 表空间文件 与InnoDb存储引擎密切相关的文件包括重做日志文件和表空间文件,首先来说说我对表空间文件的理解。 设置innodb_data_file_path这个参数之后,所有InnoDB引擎表的数据都会记录到该共享表空间中,如果设置了参数innodb_file_per_table,则用户可以将每个基于InnoDB 重做日志文件 在默认情况下,InnoDB存储引擎的根目录下面会有两个名为ib_logfile0和ib_logfile1的文件,这两个文件被称之为重做日志文件,也叫redo log file。 它们的作用是当实例意外失败时,如数据库所在的主机断电导致实例失败,这个时候,重做日志文件就会派上用场,InnoDB存储引擎会利用这个文件来恢复到断电之前的状态,从而保证数据的完整性。 其实它们的区别主要包含下面几个: 1.binlog会记录所有与MySQL有关的日志记录,包含InnoDB,MyIsam等其他存储引擎的记录,而redo log只记录InnoDB存储引擎的事务日志。
一、 什么是存储引擎 存储引擎位于文件系统(各种数据,二进制形式)之上,各种管理工具(连接池、语义分析器、优化器、缓存区、SQL接口)之下。 image.png 二、存储引擎功能设计 2.1 功能丰富性(或者SQL语义支持): 事务(和文件系统的最大区别),锁的粒度(行或者表),全文索引,簇索引,外键(这是什么) 2.1.1 事务: 事务的隔离性由锁实现 为什么innodb的内存会比其他的存储引擎大呢? 查看innodb引擎的内存脚本:https://github.com/lumanyu/niu-command/blob/master/show_memory_usage.sh 什么是数据库实例(类似于服务器的进程 engine innodb status。
MySQL(本章节) PostgreSQL MongoDB Redis Etcd 通过前面一个小节的介绍,我们对数据引擎有一个简单的认识,今天我们来介绍一个目前大面积使用的另外一个引擎:InnoDB。 事务支持 (ACID Compliant) 这是 InnoDB 最核心的特性,也是它取代 MyISAM 成为默认引擎的主要原因。 原子性 (Atomicity): 通过 Undo Log 实现。 外键约束 (Foreign Key Support) InnoDB 是 MySQL 中唯一原生支持外键约束的常用存储引擎。 作用: 强制保持数据的参照完整性。 效果: 读操作不会阻塞写操作,写操作也不会阻塞读操作,这使得 InnoDB 即使在有大量读写混合操作的情况下也能保持良好的性能。 5. #前面是myisam引擎,后面是innodb引擎 -rw-r----- 1 mysql mysql 8672 Sep 16 21:35 myisam_table.frm -rw-r----- 1 mysql
InnoDB引擎的底层实现 InnoDB的存储文件有两个,后缀名分别是 .frm和 .idb;其中 .frm是表的定义文件, .idb是表的数据文件。 1、InnoDB引擎采用B+Tree结构来作为索引结构 B-Tree(平衡多路查找树):为磁盘等外存储设备设计的一种平衡查找树 系统从磁盘读取数据到内存时是以磁盘块位基本单位的,位于同一磁盘块中的数据会被一次性读取出来 InnoDB存储引擎使用页作为数据读取单位,页是其磁盘管理的最小单位,默认page大小是16k. MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,因此力求达到树的深度不超过3,也就是I/O不需要超过三次; 分析上面的结果,发现需要三次磁盘I/O操作,和三次内存查找操作。 InnoDB中的B+Tree InnoDB是以ID为索引的数据存储 采用InnoDB引擎的数据存储文件有两个,一个定义文件,一个是数据文件。
磁盘结构 表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。InnoDB的表空间分为5大类。 系统表空间system tablespace 在默认情况下InnoDB存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间。 3、双写缓冲(InnoDB的一大特性)∶InnoDB的页和操作系统的页大小不一致,InnoDB页大小一般为16K,操作系统页大小为4K,InnoDB的页写入到磁盘时,一个页需要分4次写。 如果存储引擎正在写入页的数据到磁盘时发生了宕机,可能出现页只写了一部分的 情况,比如只写了4K,就宕机了,这种情况叫做部分写失效(partial page write),可能会导致数据丢失。 除了InnoDB架构中的日志文件,MySQL的 Server层也有一个日志文件,叫做binlog,它可以被所有的存储引擎使用。
在阅读本文之前,强烈建议先阅读下之前两节的内容,因为事务系统和这些模块有着非常紧密的联系: MySQL · 引擎特性 · InnoDB undo log 漫游 MySQL · 引擎特性 · InnoDB redo log漫游 MySQL · 引擎特性 · InnoDB 崩溃恢复过程 事务开启 InnoDB 提供了多种方式来开启一个事务,最简单的就是以一条 BEGIN 语句开始,也可以以 START 读写事务并不意味着一定在引擎层就被认定为读写事务了,5.7版本InnoDB里总是默认一个事务开启时的状态为只读的。 Engine/Engine XA 当binlog关闭时,如果事务跨引擎了,就可以在事务引擎间进行XA了,典型的例如InnoDB和TokuDB(在RDS MySQL里已同时支持这两种事务引擎)。 事务引擎本身在使用undo时,必须加上这个XID标识。 在进行事务Prepare阶段,若事务涉及到多个引擎,先在各自引擎里做事务Prepare。
1 innodb存储引擎介绍 innodb存储引擎支持两种常见的索引:B+树索引和哈希索引。 innodb支持哈希索引是自适应的,innodb会根据表的使用情况自动生成哈希索引。 聚集索引 Innodb存储引擎表是索引组织表,即表中数据按主键顺序存放。而聚集索引就是按每张表的主键构造一颗B+树。并且叶节点存放整张表的行记录数据。每张表只能有一个聚集索引(一个主键)。 叶级别不包含行的全部数据,叶级别除了包含行的键值以外,每个索引行还包含了一个书签(bookmark),该书签告诉innodb存储引擎,哪里可以找到与索引对应的数据。 当通过辅助索引查找数据时,innodb会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键。然后再通过主键索引找到一行完整的数据 3 使用场景 快速查找符合where条件的记录 快速确定候选集。
概述: InnoDB存储引擎提供了具有提交,回滚,和崩溃恢复能力的事务安全,对比MYISAM 的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 自动增长与索引 对于InnoDB表,自动增长列必须是索引,如果是组合索引,也必须是组合索引的第一列。但对于MYISAM 表,自增长列可以是组合索引的其他列。 外键约束 mysql 支持外键的存储引擎只有innodb,在创建外键的时候,要求父表必须有对应的索引,子表创建外键的时候也会自动创建对应的索引 下面演示两个表 country 父表country_id 存储方式(简单了解) innodb存储表和索引有两种方式。 一是使用共享表空间存储,这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身进行管理。 从MySQL4.1(包括4.1)版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。此外,InnoDB存储引擎支持用裸设备(row disk)用来建立其表空间。 InnoDB存储引擎是MySQL数据库最为常用的一种引擎 一 Innodb 简介 -- 从MySQL 5.5版本开始是默认的表存储引擎(之前的版本InnoDB存储引擎仅在Windows下为默认的存储引擎 这些都证明了InnoDB是一个高性能、高可用、高可扩展的存储引擎。 在InnoDB 1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成。
在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中。从MySQL5.5.8开始,InnoDB成为其默认的存储引擎。 体系架构 InnoDB存储引擎是由内存池、后台线程、磁盘存储三大部分组成。 ? 线程 InnoDB 使用的是多线程模型, 其后台有多个不同的线程负责处理不同的任务。 内存 InnoDB 存储引擎内存的结构 ? 缓冲池 InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。 缓冲池的大小直接影响数据库的整体性能,对于InnoDB存储引擎而言,缓冲池配置通过参数 innodb_buffer_pool_size 来设置。 InnoDB引擎通过使用Next-Key Lock解决了幻读的问题。
编辑 InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。 中文名 innodb 外文名 innodb 类 型 mysql数据库引擎 开发公司 Innobase Oy公司 特 色 支持了ACID兼容的事务 授权 GPL授权,专有软件授权 目录 1.1 简介 2.2 InnoDB是为处理巨大数据量时的最大性能设计。InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。 在 MySQL 的源代码中,从 3.23.34a 开始包含 InnoDB 表引擎,并在 MySQL -Max 的二进制版本中激活。
其中较为知名的存储引擎为MyISAM与InnoDB. MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会先传输到存储引擎,然后按照各个存储引擎的存储格式进行数据存储。 7、MyISAM存储的文件类型: .frm 文件存储表定义; 数据文件扩展名为.MYD(MYDATA); 索引文件扩展名为.MYI(MYIndex); InnoDB存储引擎特点 1、支持事务处理 info; 配置存储引擎的几种方式: 1、使用alter table命令修改: (修改现有表的存储引擎) alter table info engine=MyISAM/InnoDB; //进入数据库操作 2、修改默认存储引擎: (针对后面新创建的表格起作用) #vim /etc/my.cnf default-storage-engine=MyISAM/InnoDB //在[mysql]服务栏下设置默认存储引擎 3、在创建表时指定使用的存储引擎种类: //在mysql模式下 create table test(name varchar(10)) engine=InnoDB; show create table
预计阅读时间: 18分钟 前言: 本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍《MySQL技术内幕++InnoDB存储引擎》,今年的多数学习知识只写在笔记里,较为零散,最近稍有时间整理出来 7、各式的插件式存储引擎。 8、物理文件。 其中存储引擎是基于表,而非数据库。 二、InnoDB体系结构 ? InnoDB引擎包含几个重要部分: 1、后台进程: 1.1 Master Thread:核心线程,负责缓冲池的数据异步入盘,包括脏页刷新、合并插入缓冲、undo页回收等。 5.2 innodb_force_recovery 参数innodb_force_recovery直接影响InnoDB的恢复情况。 3.2 InnoDB存储引擎文件 3.2.1 表空间文件 默认共享表空间为ibatat1,可通过设定innodb_data_file_path=/db/ibdata1:2000M; /dir2/
MySQL从5.5版本开始将InnoDB作为默认存储引擎,该存储引擎是第一个完整支持事务ACID特性的存储引擎,且支持数据行锁,多版本并发控制(MVCC),外键,以及一致性非锁定读。 作为默认存储引擎,也就意味着默认创建的表都会使用此存储引擎,除非 使用ENGINE=参数指定创建其他存储引擎的表。 而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。 表 通过create table语句创建InnoDB表,因为默认存储引擎就是InnoDB,所以不需要在创建表的语句最后指定engine=innodb。 修改表的存储引擎 通过alter table语句修改已有表的存储引擎 ALTER TABLE table_name ENGINE=InnoDB; 自增长字段设置 当对InnoDB表设置了自增长字段之后
MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。 InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。 本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理解它的特性和优势。 1. 事务支持 InnoDB 是一个事务性存储引擎,支持ACID(原子性、一致性、隔离性、持久性)属性。 InnoDB 存储引擎提供了高度可靠的事务支持、高并发性能、数据完整性和可恢复性,适用于大多数生产环境的 MySQL 数据库应用程序。然而,在选择存储引擎时应根据应用程序的具体需求进行权衡和决策。 InnoDB 存储引擎的强大功能使其成为许多企业和开发人员的首选,尤其是需要事务支持和高并发性能的应用程序。通过深入了解其特性,您可以更好地利用 InnoDB 来构建稳定、高性能的数据库应用程序。