MySQL原理(二)存储引擎(3)InnoDB
目录
一、概况:
1、介绍:
2、特点:
二、体系架构
1、后台线程
2、内存池(缓冲池)
三、物理结构
1、数据文件(表数据和索引数据)
1.1、作用:
1.2、共享表空间与独立表空间
1.3、共享表空间
1.4、独立表空间
2、日志文件
2.1、介绍
2.2、作用
2.3、配置参数:
四、配置参数
一、概况:
1、介绍:
从Mysql5.5版本开始,InnoDB是默认的表存储引擎。
2、特点:
(1)支持事务安全:
InnoDB 最重要的一点就是支持事务,可以说这是 InnoDB 成为 MySQL 中最流行的存储引擎的一个非常重要的原因。InnoDB 还实现了 SQL92 标准所定义的 4 个隔离级别(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ 和 SERIALIZABLE)。
(2)数据多版本读取;
(3)锁定机制的改进,行锁设计;
(4)支持外键:
InnoDB 支持外键约束,检查外键、插入、更新和删除,以确保数据的完整性。在存储表中数据时每张表的存储都按主键顺序存放,如果没有显式地在定义表时指定主键,InnoDB 会为每一行生成一个 6 字节的 ROWID ,并以此作为主键。
(5)实现了缓冲处理:
InnoDB 提供了专门的缓存池,实现了缓冲管理,不仅能缓冲索引也能缓冲数据,常用的数据可以直接从内存中处理,比从磁盘获取数据处理速度要快。相比之下,MyISAM 只是缓存了索引。
(6)灾难恢复性好
InnoDB 通过 commit、rollback、crash-recovery 来保障数据的安全。具体来说,crash-recovery 就是指如果服务器因为硬件或软件的问题而崩溃,不管当时数据是怎样的状态,在重启 MySQL 后,InnoDB 都会自动恢复到发生崩溃之前的状态,并回到用户离开的地方。
(7)支持MVCC、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。
二、体系架构
InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池。后台线程主要负责刷新内存池中的数据、将已修改的数据刷新到磁盘等等。
1、后台线程
InnoDB后台有多个不同的线程,用来负责不同的任务。主要有如下:
(1)Master Thread
这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等.
(2)IO Thread
在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调处理。
(3)Purge Thread
事务被提交之后, undo log 可能不再需要,因此需要 Purge Thread 来回收已经使用并分配的 undo页. InnoDB 支持多个 Purge Thread, 这样做可以加快 undo 页的回收。
(4)Page Cleaner Thread
Page Cleaner Thread 是在InnoDB 1.2.x版本新引入的,其作用是将之前版本中脏页的刷新操作都放入单独的线程中来完成,这样减轻了 Master Thread 的工作及对于用户查询线程的阻塞。
2、内存池(缓冲池)
InnoDB 存储引擎是基于磁盘存储的,也就是说数据都是存储在磁盘上的,由于 CPU 速度和磁盘速度之间的鸿沟,InnoDB 引擎使用缓冲池技术来提高数据库的整体性能。缓冲池简单来说就是一块内存区域.在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判断该页是不是在缓冲池中,若在,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。对于数据库中页的修改操作,首先修改在缓冲池中页,然后再以一定的频率刷新到磁盘,并不是每次页发生改变就刷新回磁盘。
缓冲池中缓存的数据页类型有:索引页、数据页、 undo 页、插入缓冲、自适应哈希索引、 InnoDB 的锁信息、数据字典信息等。索引页和数据页占缓冲池的很大一部分。在InnoDB中,缓冲池中的页大小默认为16KB。
Buffer Pool其实是一片连续的内存空间,InnoDB为每一个缓存页都创建了一些所谓的控制信息,这些控制信息包括该页所属的表空间编号、页号、页在Buffer Pool中的地址,一些锁信息以及LSN信息(锁和LSN这里可以先忽略),当然还有一些别的控制信息。每个缓存页对应的控制信息占用的内存大小是相同的,
三、物理结构
使用 InnoDB 时,MySQL 会在数据目录(Data)下创建一个名为 ibdata1 的 10MB 大小的自动扩展数据文件,以及两个名为 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件。InnoDB 存储引擎和 MyISAM 不太一样,虽然也有 .frm 文件来存放表结构定义相关的元数据,但是表数据和索引数据是存放在一起的。至于是每个表单独存放还是所有表存放在一起,用户可以自己设置。InnoDB 的物理存储结构分为两大部分:
1、数据文件(表数据和索引数据)
1.1、作用:
数据文件用来存放数据表中的数据和所有的索引数据,包括主键和其他普通索引。
1.2、共享表空间与独立表空间
InnoDB 存储的数据采用表空间(Tablepace)进行存放设计。表空间是用来存放 MySQL 系统相关信息的一个特殊共享表空间。InnoDB 的表空间分为以下两种形式:
(1)共享表空间,表数据和索引都存放在同一个表空间。默认的表空间文件就是上面所提到的 MySQL 初始化路径下的 ibdata1 文件;
(2)独立表空间,每个表的数据和索引被存放在一个单独的 .ibd 文件中。
可以通过以下命令查看 MySQL 是否使用独立表空间:
SHOW VARIABLES LIKE 'innodb_file_per_table%';
innodb_file_per_table 值为 ON 时表示开启独立表文件,InnoDB 表的数据和索引都会以单独的形式存放;值为 OFF 时,InnoDB 表的数据和索引都存放在一个表空间。可以通过设置该参数的值来决定是否使用独立表空间。
如我的
1.3、共享表空间
(1)共享表空间的数据文件可以设置为固定大小和可自动扩展大小两种形式。自动扩展形式的文件可以设置文件的最大大小和每次扩展量。在创建自动扩展的数据文件时,建议最好加上最大尺寸的属性,一个原因是文件系统本身有一定的大小限制,还有一个原因就是方便自身维护。
(2)当表空间快要用完的时候,我们必须要为其增加数据文件,当然,只有共享表空间有此操作。在mysql配置文件 innodb_data_file_path 参数后面按照标准格式设置好文件路径和相关属性即可,设置完 innodb_data_file_path 参数后,所有基于 InnoDB 存储引擎的表的数据都会记录到该共享表空间中
innodb_data_file_path=datafile_spec1[;datafile_spec2]...其中,datafile_spec1 格式为表空间文件路径:大小:属性,还可以指定多个文件组成一个表空间,同时指定文件的属性,如
[mysqld]
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
表示将 /db/ibdata1 和 /dr2/db/ibdata2 两个文件用来组成表空间。若这两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。
指定多个文件时,autoextend 属性只在最后一个数据文件中指定,表示表空间自动扩展。这里表示文件 ibdata1 的大小为 2000MB,文件 ibdata2 的大小为 2000MB,如果用完了 2000MB,该文件还可以自动增长。
使用以下命令查看当前共享表空间文件的路径、大小和自动化策略:
SHOW VARIABLES LIKE 'innodb_data_file_path%';
注意:InnoDB 在创建新数据文件时不会创建目录,如果指定目录不存在,则会报错并无法启动。另外,InnoDB 给共享表空间增加数据文件之后,必须要重启数据库系统才能生效。这也是大多数人一直不太喜欢使用共享表空间而选用独立表空间的原因之一。
1.4、独立表空间
通过设置 innodb_file_per_table 参数,可以将每个基于 InnoDB 存储引擎的表产生一个独立表空间。独立表空间的命名规则为表名.ibd
。通过这样的方式,用户不用将所有数据都存放于默认的表空间中。使用 SET 命令打开/关闭独立表空间
mysql> SET GLOBAL innodb_file_per_table=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set, 1 warning (0.03 sec)mysql> SET GLOBAL innodb_file_per_table=0;
Query OK, 0 rows affected (0.00 sec)mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF |
+-----------------------+-------+
1 row in set, 1 warning (0.00 sec)
注意:需要注意的是,单独的表空间文件只存储该表的数据、索引和缓冲等信息。所以无论是使用共享表空间还是独享表空间来存放表,共享表空间都是必须存在的。
2、日志文件
2.1、介绍
默认情况下,InnoDB 存储引擎的数据目录下会有两个名为 ib_logfile0 和 ib_logfile1 的文件。在 MySQL 官方手册中将其称为 InnoDB 存储引擎的重做日志文件(redo log file)。每个 InnoDB 存储引擎至少有 1 个重做日志文件组(group),每个文件组下至少有 2 个重做日志文件,如默认的 ib_logfile0 和 ib_logfile1。
2.2、作用
重做日志文件对 InnoDB 存储引擎至关重要。InnoDB 可以通过重做日志将数据库宕机时已经完成但还没有来得及将数据写入磁盘的事务恢复,也能将所有部分完成并已经写入磁盘的未完成事务回滚,并且将数据还原,以此来保证数据的完整性。
注意:如果你的数据库中有 InnoDB 的表,那么千万别全部删除 InnoDB 的日志文件,这很可能会让你的数据库 Crash(数据库不工作或停止响应、进程中断等情况,在业界也叫做数据库 Crash),无法启动,或者丢失数据。
2.3、配置参数:
影响重做日志文件的参数:
(1)innodb_log_file_size:指定每个重做日志的大小。
(2)innodb_log_files_in_group:指定日志文件组中重做日志文件的数量,默认为 1。
(3)innodb_mirrored_log_groups:指定日志镜像文件组的数量,默认为 1。
(4)innodb_log_group_home_dir:指定日志文件组所在路径,默认为./。
四、存储结构
1). 表空间表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在8.0版本中默认开启) ,则每个库中的表及其索引等都会有一个单独表空间(xxx.ibd),如果没有启用,所有的库及其数据都会在系统表空间中。一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。
2). 段
段,分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段
(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的非叶子节点。段用来管理多个Extent(区)。
3). 区
区,表空间的单元结构,每个区的大小为1M。 默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页。
4). 页
页,是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。为了保证页的连续性,
InnoDB 存储引擎每次从磁盘申请 4-5 个区。
5). 行
行,InnoDB 存储引擎数据是按行进行存放的。 在行中,默认有两个隐藏字段:
Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。
Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个
隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
五、配置参数
在 MySQL 启动参数文件设置中,InnoDB 的所有参数基本上都带有前缀“innodb_”,不论是 InnoDB 数据还是和日志相关,或者是其他一些性能,事务等等相关的参数都是一样。
在 MySQL 中,可以通过 skip-innodb 参数来屏蔽 InnoDB 存储引擎,这样即使我们在安装编译时,安装了 InnoDB 存储引擎,使用者也无法创建 InnoDB 的表。
相关文章:

MySQL原理(二)存储引擎(3)InnoDB
目录 一、概况: 1、介绍: 2、特点: 二、体系架构 1、后台线程 2、内存池(缓冲池) 三、物理结构 1、数据文件(表数据和索引数据) 1.1、作用: 1.2、共享表空间与独立表空间 …...

基于Springboot的高校心理教育辅导设计与实现(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的高校心理教育辅导设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…...

jenkins pipeline配置maven可选参数
1、在Manage Jenkins下的Global Tool Configuration下对应的maven项添加我们要用得到的不同版本的maven安装项 2、pipeline文件内容具体如下 我们maven是单一的,所以我们都是配置单选参数 pipeline {agent anyparameters {gitParameter(name: BRANCH_TAG, type: …...

【博士每天一篇论文-算法】Continual Learning Through Synaptic Intelligence,SI算法
阅读时间:2023-11-23 1 介绍 年份:2017 作者:Friedemann Zenke,巴塞尔大学弗里德里希米歇尔研究所(FMI) Ben Poole,谷歌 DeepMind 研究科学家 期刊: International conference on machine learning. PMLR…...

【软件工程】建模工具之开发各阶段绘图——UML2.0常用图实践技巧(功能用例图、静态类图、动态序列图状态图活动图)
更多示例图片可以参考:(除了常见的流程图,其他都有) 概念:类图 静态:用例图 动态:顺序图&状态图&活动图 1、【面向对象】UML类图、用例图、顺序图、活动图、状态图、通信图、构件图、部…...

Typora导出word
Typora导出word Typora是一款简洁易用的Markdown编辑器, Pandoc是一个文档转换工具,可以将Markdown格式的文档转换为其他格式,如HTML、PDF等. linux下安装 Pandoc : sudo apt install -y pandoc安装成功后,typora 会自动监测到. 然后 点击文件->…...

CSS 星空按钮
<template><button class="btn" type="button"><strong>星空按钮</strong><div id="container-stars"><div id="stars"></div></div><div id="glow"><div class=…...

Kotlin快速入门系列10
Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。与Java一样,Kotlin也支持委托模式,通过关键字by。 类委托 类的委托即一个类中定义的方…...

Docker中配置MySql环境
目录 一、简单安装 1. 首先从Docker Hub中拉取镜像 2. 启动尝试创建MySQL容器,并设置挂载卷。 3. 查看mysql8这个容器是否启动成功 4. 如果已经成功启动,进入容器中简单测试 4.1 进入容器 4.2 登录mysql中 4.3 进行简单添加查找测试 二、主从复…...

智慧文旅:驱动文化与旅游融合发展的新动力
随着科技的快速发展和人们生活水平的提高,文化和旅游的融合成为了时代发展的必然趋势。智慧文旅作为这一趋势的引领者,通过先进的信息技术手段,推动文化与旅游的深度融合,为产业的发展注入新的活力。本文将深入探讨智慧文旅如何成…...

wordpress怎么做产品展示站?推荐使用MOK主题和ent主题
大多数WordPress站点都是个人博客网站,主要以文章性质的图文为主。不过部分站长想要用WordPress搭建一个产品展示站,应该怎么做呢? 其实,WordPress可以用来建立各种各样的博客网站,包括个人博客、企业网站、商城、影视…...

8、应急响应-战前溯源反制主机蜜罐系统HFishHIDSElkeidWazuh
用途:个人学习笔记,欢迎指正 目录 背景: 一、潮源反制-平台部署-蜜罐-Hfish 二、溯源反制-平台部署-HIDS-Wazuh 三、溯源反制-平台部署-HlDS-Elkeid-hub 背景: 攻击者对服务器存在着各种威胁行为,作为安全人员&am…...

LeetCode:283. 移动零
283. 移动零 1)题目2)代码方法一:两层for循环方法二:使用双指针 3)结果方法一结果方法二结果 1)题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的…...

游戏开发丨基于Panda3D的迷宫小球游戏
文章目录 写在前面Panda3D程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于panda3d的迷宫中的小球游戏 所需环境 pythonpycharm或anacondapanda3d 下载地址 https://download.csdn.net/download/m0_68111267/88792121 Panda3D Panda3D是一种开放源代码…...

微信小程序 安卓/IOS兼容问题
一、背景 在开发微信小程序时,不同的手机型号会出现兼容问题,特此记录一下 二、安卓/IOS兼容问题总结 2.1、new Date()时间转换格式时,IOS不兼容 问题:在安卓中时间格式2024-1-31 10:10:10,但是在iOS中是不支持 &q…...

结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天
结构体 注意: 1.结构体类型 可以定义在 函数里里面 但是此时作用域就被限定在该函数中 2.结构体定义形式 //形式一 限定一类型 后定义变量 struct stu { ... }; struct stu s; //形式二 定义类型的同时 定义变量 struct stu { ... }s1,s2,*s3,s4[10]; struc…...

猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这…...

python-自动化篇-运维-实现读取日志文件最后一行的时间
文章目录 1. 使用Python打开日志文件2.python读取文件最后一行两种方式3.读取当前时间,进行两者相减,超时报警4.将内容推送到企业微信5. 关闭日志文件整体代码 1. 使用Python打开日志文件 在开始实时读取日志文件之前,我们首先需要打开一个日…...

QT SQL
QT SQL模块提供数据库编程的支持,支持多种常见的数据库:MySQL\Oracle\MS SQL Server\SQLite等。SQL模块包含多个类,可以实现:数据库连接、SQL语句执行、数据获取与界面显示 等功能。数据 与 界面间用Model\View架构。 一、 二、Q…...

C++(20):通过concept及nlohmann将数据转换为字符串
nlohmann可以自动兼容将C++的很多原生类型转换为json,甚至自定义类型也不需要太复杂的操作就可以转换为json,可以利用这一点将数据转换为string: #include <nlohmann/json.hpp> #include <string> #include <vector> #include <tuple> #include <…...

Transformer 自然语言处理(四)
原文:Natural Language Processing with Transformers 译者:飞龙 协议:CC BY-NC-SA 4.0 第十章:从头开始训练变换器 在本书的开头段落中,我们提到了一个名为 GitHub Copilot 的复杂应用,它使用类似 GPT 的…...

BRAIN :帕金森病中与痴呆相关的动态功能连接改变
fMRI成像手段由于其在高空间分辨率的优势获得了疾病研究的青睐,越来越多的疾病研究使用fMRI手段来通过找到特异的神经标记物从而提升临床治疗的诊断效力以及准确率。但是,功能磁共振受到其时间分辨率相对较低这一缺点的影响,在对疾病时间特异…...

harmony os系统
因为实验室配的是Windows电脑,最近在搜索marginnote有没有windows的版本,不然好多功能相似的软件在使用不能信息同步是挺麻烦的。搜索结果当然还是没有对应版本。那我退而求其次,看看怎么在Windows上使用marginnote,结果大家意见基…...

2024美赛数学建模A题思路源码——七鳃鳗性别比例和生态系统关系
赛题目的:分析一个物种根据资源可用性改变其性别比例的能力的利弊。开发一个模型,分析对生态系统中由此产生的相互作用。 问题一.七鳃鳗性别比例对生态系统的影响 问题分析 建立一个简化版的模型,来探讨以下问题: 1.我们假设七鳃鳗种群的增长遵循Logistic生长模型,其中食…...

C语言的基础学习
C语言的变量 ## C语言中的变量 在C语言中,变量是对程序中数据所占内存空间的一种抽象定义。定义变量时,用户定义变量的名、变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定变量在内存中的位置 [❷](https://www.dotcpp.com/cour…...

PostGIS教程学习二十二:使用触发器追踪历史编辑操作
PostGIS教程学习二十二:使用触发器追踪历史编辑操作 生产环境下数据库的一个常见要求是能够跟踪用户编辑数据的历史:数据在两个日期之间是如何变化的,是谁操作的,以及它们哪些内容变化了?一些GIS系统通过在客户端接口…...

【PTA浙大版《C语言程序设计(第4版)》编程题】练习7-4 找出不是两个数组共有的元素(附测试点)
目录 输入格式: 输出格式: 输入样例: 输出样例: 代码呈现 测试点 给定两个整型数组,本题要求找出不是两者共有的元素。 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数&a…...

C++面试:数据库不同存储引擎的区别以及如何选择
目录 基础 具体选择原则 Mysql如何选择 创建表时指定存储引擎 修改现有表的存储引擎 查看表的存储引擎 注意事项 总结 在数据库管理系统中,不同的存储引擎提供了不同的存储机制、索引技术、锁定水平和其他功能。以MySQL为例,它支持多种存储引擎&…...

HTML -- 常用标签
目录 HTML 标签 单标签 双标签 常见标签的使用 标题和段落 换行、分隔、超链接 列表标签 表单标签 属性 属性的使用 HTML HTML(Hyper Text Markup Language),超文本标记语言,是一门标记语言,不是编程语言&am…...

【Qt】QInputDialog setGeometry: Unable to set geometry 问题
【Qt】QInputDialog setGeometry: Unable to set geometry 问题 文章目录 I - 问题背景II - 解决办法III - 参考链接 I - 问题背景 创建了一个 QMainWindow 并在上边创建了布局,尝试调用 QInputDialog 的 getInt 静态方法,结果运行时出现了以下警告 QW…...