【MySQL】InnoDB引擎

逻辑结构

InnoDB存储引擎逻辑结构如图所示:

Tablespace:表空间,一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间,用来存放表记录、索引等数据。

Segment:段,表空间中有多个段,而每个段中将表空间中的记录、索引等数据分为数据段、索引段、回滚段来存储。其中索引段就存储在B+树的非叶子结点,数据段就存储在叶子结点上。段中又管理多个区(Extent)。

Extent:区,表的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎的页大小为16k,那么每个区中就存储64个连续的页。

Page:页,是InnoDB存储引擎管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB每次从磁盘申请4~5个区。页中存放的就是表空间的记录和索引。

Row:行,在InnoDB引擎中数据是按行进行存放的。

Trx id 和Roll pointer是表结构中隐藏的两个字段。

Trx id :事务id,是用来存储最后一个操作的事务id。

Roll pointer:回滚指针,指向上一个版本记录在undo log的位置。多个版本被Roll pointer连接成一个版本链。这也是MVCC的原理。

InnoDB架构

MySQL5.5版本之后,默认的存储引擎是InnoDB,InnoDB的架构图如下:

内存结构

内存结构如图:

Buffer Pool:缓冲池,是主内存的一个区域,用来缓存磁盘上记录操作频繁的实时数据。在进行增删改查操作时,先查询缓冲池中是否有数据,如果没有,则需要从磁盘中加载到缓冲池,再进行对应的操作。然后将这些脏页以一定的频率刷新到磁盘当中。

缓冲池以Page为单位,底层采用链表来管理数据的。根据状态,将缓冲池中的Page分为三种:

free page :空闲页,该页中没有存放任何数据。

clean page :被使用的页,其中存放的数据是从磁盘加载过来的,并未被修改。

dirty page :脏页,该页中的数据被修改,即该页中的数据是最新的,和磁盘中的内容是不一致的。

Change Buffer:更改缓冲区,在执行DML语句时,如果Buffer Pool中没有对应的数据页,那么就将数据变更存储在Change Buffer中。之后读取这些数据时,会将磁盘中的数据与Change Buffer中的变更记录合并加载到Buffer Pool中。

Changer Buffer有什么意义?

Change Buffer是针对非唯一的二级索引。二级索引是随机的,如果多个修改操作直接通过磁盘IO操作,由于其随机性就会造成大量的磁盘IO,性能就会大打折扣。使用Change Buffer不会进行随机磁盘IO,从而减少了损耗。

Adaptive Hash Index:自适应哈希索引,用于优化Buffer Pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,就会自动建立索引。

自适应哈希索引无需人工干预,由_MySQL自动执行。

可以通过 adaptive_hash_index参数进行控制,默认为ON,代表是开启的。

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

参数:innodb_log_buffer_size:缓冲区大小

Innodb_flush_log_at_trx_commit:日志刷新到磁盘时机。

磁盘结构

磁盘结构如图:

System Tablespace:系统表空间,是更改缓冲区的存储区域。如果系统中独立表空间以及通用表空间关闭的话,系统表空间也会存储表的记录以及索引。

参数:innodb_data_file_path

File-Per-Table Tablespaces:每个表的独立表空间。默认是开启的。

参数:innodb_file_per_table

General Tablespaces:通用表空间,需要手动进行创建。在创建表时,可以为其指定表空间。

创建表空间语法:

CREATE TABLESPACE XXXX ADDDATAFILE 'file_name'ENGINGE = engine_name;

指定表空间语法:

CREATE TABLE XXX (...)TABLESPACE ts_name;

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

Temporary Tablespaces:临时表空间,存储用户创建的临时表。

Doublewrite Buffer Files:双写缓冲区,innoDB引擎将数据页刷新到磁盘时,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。

Redo Log:重做日志,用来实现事务的持久性。

后台线程

InnoDB存储引擎涉及到很多内存与磁盘之间的操作,比如从脏页的刷新、磁盘文件的加载、日志的刷新等,这些操作都是由后台线程完成的。

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

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

线程类型默认个数职责
Read thread4负责读操作
Write thread4负责写操作
Log thread1负责将日志缓冲区刷新到磁盘
Insert buffer thread1负责将写缓冲区内容刷新到磁盘

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-乘积尾零

solution 找末尾0的个数&#xff0c;即找有多少对2和5 >问题等价于寻找所给数据中&#xff0c;有多少个2和5的因子&#xff0c;较少出现的因子次数即为0的个数 #include <iostream> using namespace std; int main() {// 请在此输入您的代码printf("31");…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述&#xff1a; m块砖&#xff0c;n人搬&#xff0c;男搬4&#xff0c;女搬3&#xff0c;两个小孩抬一砖&#xff0c;要求一次全搬完&#xff0c;问男、 女、小孩各若干&#xff1f; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.S…

3.C++:类与对象(下)

一、再谈构造函数 1.1构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;i…

== 和 equals 的区别是什么?

和 equals() 在 Java 中都是用于比较两个对象&#xff0c;但它们之间存在显著的差异&#xff1a; 比较的内容&#xff1a; &#xff1a;这是 Java 中的基本比较运算符&#xff0c;对于基本数据类型&#xff08;如 int, char, double 等&#xff09;&#xff0c;它比较的是值&a…

二手车交易网站|基于JSP技术+ Mysql+Java+ B/S结构的二手车交易网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

将若依项目部署上线

1. 购买轻量服务器&#xff0c;新人优惠一年61元&#xff08;有点赚&#xff09;&#xff1b; 2. 在轻量服务器重置密码&#xff0c;再远程连接。 3. 登录宝塔面板&#xff1b; 4. 下载mysql5.7&#xff0c;redis7.2&#xff0c;nginx 5. 在宝塔页面设置数据库密码&#xf…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…

OC高级编程 第3章:Grand Central Dispatch

3.1 Grand Central Dispatch (GCD)概要 3.1.1什么是GCD Grand Central Dispatch&#xff08;GCD&#xff09;是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中&#xff0c;GCD就能生成必要的…

如何使用Docker安装Paperless-ngx系统并实现远程在线搜索查阅文档

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使用。它内置…

登录注册界面

T1、编程设计理工超市功能菜单并完成注册和登录功能的实现。 显示完菜单后&#xff0c;提示用户输入菜单项序号。当用户输入<注册>和<登录>菜单序号时模拟完成注册和登录功能&#xff0c;最后提示注册/登录成功并显示注册信息/欢迎XXX登录。当用户输入其他菜…

Docker操作基础命令

注意&#xff1a;以下命令在特权模式下进行会更有效&#xff01; 进入特权模式 sudo -ssudo su拉取镜像 sudo docker pull [镜像名] # sudo docker pull baiduxlab/sgx-rust:2004-1.1.3进入容器 端口开启服务&#xff1a; sudo docker start 3df9bf5dbd0c进入容器&#xf…

Open CASCADE学习|将圆转换为NURBS曲线

NURBS曲线&#xff0c;全称非均匀有理B样条曲线&#xff08;Non-Uniform Rational B-Splines&#xff09;&#xff0c;是计算机图形学中用于表示几何形状的数学表示方法。它结合了非均匀B样条&#xff08;B-Splines&#xff09;和有理基函数&#xff08;Rational Basis Functio…

R语言迅速计算多基因评分(PRS)

Polygenic Risk Scores in R 最朴素的理解PRS&#xff1a; GWAS分析结果中&#xff0c;有每个SNP的beta值、se值、P值&#xff0c;因为GWAS分析中将SNP变为0-1-2编码&#xff0c;所以这些显著的SNP的beta值&#xff0c;就可以用于预测。 比如&#xff1a;GWAS分析中&#xf…

SQL语言: 基本操作

DDL(数据定义) 库 创建数据库 CREATE DATABASE database_name; 删除数据库 DROP DATABASE database_name; 选择数据库 USE database_name; 表 创建表格 CREATE TABLE table_name( column1 datatype, column2 datatype, ... ); 删除表格 DROP TABLE table_name; 修改表格ALT…

linux内核网络中的互斥 “每日读书”

网络代码中广泛使用上锁&#xff0c;本书中每项主题下&#xff0c;可能都会发现上锁的议题&#xff0c;对众多程序设计类型而言&#xff0c;尤其是针对内核的程序设计&#xff0c;互斥&#xff0c;上锁机制以及同步都是一般性主题&#xff0c;而且相当有趣复杂&#xff0c;linu…

QT_day3:2024/3/22

作业1&#xff1a;设计界面 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin…

【Java基础知识总结 | 第六篇】Java反射知识总结

文章目录 6.Java反射知识总结6.1概述6.1.1什么是反射&#xff1f;6.1.2为什么使用反射&#xff1f; 6.2反射的原理6.3反射的使用6.3.1获取类对象&#xff08;1&#xff09;通过具体类的类名获取&#xff08;2&#xff09;通过对象实例获取&#xff08;3&#xff09;通过class.f…

CSS设置移动端页面底部安全距离

env(safe-area-inset-bottom)是一个CSS属性值&#xff0c;用于设置底部安全距离。它表示使用环境变量来获取底部安全距离的值。当使用环境变量时&#xff0c;需要使用env()函数来引用具体的环境变量。例如&#xff1a; <style> .box{padding-bottom: env(safe-area-inse…

使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx

背景&#xff1a; 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件&#xff0c;可实现数据库文件的创建&#xff0c;执行SQL语句等功能。 遇到&#xff1a;在之前创建的表上进行新增字段的操作时候&#xff0c;出现问题&#xff1a…